Explicitly calling destructor

E

engaarea

hi all,

What are the circumstances in which one would have to call a destructor
explicitly.


Regards
5
 
M

Markus Grueneis

hi all,

What are the circumstances in which one would have to call a destructor
explicitly.

Yes, after a placement new.


best regards,
-- Markus
 
R

Rolf Magnus

hi all,

What are the circumstances in which one would have to call a destructor
explicitly.

Usually, the allocation/deallocation of storage and the
construction/destruciton of an object are done together. If you want to
separate those things, you can use the placement new operator to construct
an object into alreaedy allocated storage. The counterpart to that is the
explicit destructor call. It destroys the object, but doesn't deallocate
the storage. This is e.g. used (indirectly through an allocator) by the
standard container classes, like std::vector, because those do their own
memory management.
 
A

Aman JIANG

hi all,

What are the circumstances in which one would have to call a destructor
explicitly.


Regards
5


When you are in the circumstance that unable to use delete,
Or when you need to manage memory by yourself.


class Dolphin
{
int m_iDummy;
public:
Dolphin() { cout << "Dolphin" << endl; }
virtual ~Dolphin() { cout << "~Dolphin" << endl; }
};

int main()
{
unsigned char buffer [256];

// construct a Dolphin in buffer
Dolphin * d = new(buffer) Dolphin;

// buffer is in stack, not in heap, so you cannot use delete
// But you must destruct it, too:
d->~Dolphin();
}
 
M

Moonlit

Hi,

For example:

Consider a Variant class ( which can hold a number of types like
long/int/string etc)
To save on memory you define a union with all those variables
Now to properly construct a string in the area of the union you would need
placement new
On destruction of your string (maybe because the variant type is assigned a
'long') you have to destruct the string, but not free its memory (it can't
since it is not allocated on the heap, but in the area where the union is
located ) in this case you would explicitely call delete:


Example:

union {

Int8 Char;

Int64 Long;

//UInt8 UChar;

//UInt64 ULong;

double Double;

bool Bool;

char String [ sizeof( std::string ) ];

char Map [ sizeof( std::map<UVar*,UVar*, UFindVar> ) ];

char SRefPtr[ sizeof( MSRefPtr<ISerialize> ) ];

char WRefPtr[ sizeof( MWRefPtr<ISerialize> ) ];

char KeyStroke[ sizeof( MKey ) ];

};



UVar::UVar( const string& String ):

Type ( eString )

{

new( this->String ) string( String );

}


void UVar::CleanUp()

{

switch( Type )

{

case eString:

reinterpret_cast<std::string *const>( String )->~string();

break;

//...etc

}

}


Regards, Ron AF Greve

http://moonlit.xs4all.nl
 
F

Frederick Gotham

posted:
hi all,

What are the circumstances in which one would have to call a destructor
explicitly.


Most typically when the construction was explicit (e.g. via "placement new"):

char buffer[sizeof(string)]; /* Pretend it's suitably aligned. */

string *const p = ::new(buffer) string("Hello");

p->~string();
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,051
Latest member
CarleyMcCr

Latest Threads

Top