Re: object lifetime
On Jul 19, 6:02 pm, REH <spamj...@stny.rr.com> wrote:
I've been trying to better understand the subtle rules for object
lifetime. The standard says that pointers to the memory of a
dynamically allocated object may be used in limited ways after the
object's destructor has executed (but the memory not deallocated).
Specifically, the pointer must be a void*.
There's no strict requirement that it be converted to void*. As
long as the memory has not been freed, you can copy and compare
the pointer all you want; you can only dereference if you
convert it to a pointer to character type, and access the
underlying bytes as char or unsigned char.
Does that mean, the following is well defined?
As written, yes, but only because T is the most derived class.
#include <new>
class T {};
int main()
{
T* p = new T();
p->~T();
operator delete(static_cast<void*>(p));
You don't need the static_cast here; in fact, it doesn't change
anything.
This is legal as long as p pointed to the most derived object
initially. If you'd written something like:
Base* p = new Derived ;
// ...
p->~Base() ;
operator delete( p ) ;
Then the behavior would be undefined.
return 0;
}
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34