Archived

This topic is now archived and is closed to further replies.

Corrail

delete this

Recommended Posts

Corrail    133
Hi all! Just wanted to know if this command is legal in a method of a class of struct: delete this; Thanks a lot Corrail corrail@gmx.at ICQ#59184081

Share this post


Link to post
Share on other sites
OrangyTang    1298
I can''t remember the exact details, but it is legal - providing you don''t touch any member variables or functions after the call. You''ve got to be careful that the caller knows that its about to happen as well usually so it doesn''t assume the object still exists.

In MFC for example, there is a couple of points where its valid to do this if you are going to since the object will be discarded afterwards.

Share this post


Link to post
Share on other sites
Russell    118
I used delete this; to write a binary tree class once, and it worked fine. If you did delete this; it would call the destructor, which called the child node destructors, which contained delete this;, and so on, so you could deallocate a node and all of it''s sub-nodes with one statement: delete this;

Share this post


Link to post
Share on other sites
Sneftel    1788
Remember that you should only ever do this if you KNOW the object was allocated with new, rather than being allocated on the stack or statically/globally.


How appropriate. You fight like a cow.

Share this post


Link to post
Share on other sites
antareus    576
C++ is *NOT* merely an OO language! It supports it, but it doesn''t force you into it!

Its an important distinction. If it was an OO language you''d be forced to use classes everywhere.

Share this post


Link to post
Share on other sites
Sneftel    1788
quote:
Original post by Fredrik Dahlberg
And how do you know how the object was allocated?

If the constructor is private and creation methods only ever do dynamic allocation, you know.

quote:
My opinion: C++ should be more strict. Doing stuff like this is not really OO and it doesn''t really serve a purpose.

It is really OO, and it does really serve a purpose. You just haven''t seen any situations where it''s useful yet.


How appropriate. You fight like a cow.

Share this post


Link to post
Share on other sites
RenderTarget    398
Refcounted classes, like COM classes, are typically implemented this way. Since they''re always created on the heap, it''s guaranteed. The Release() method basically looks like


if( -- m_cRefCount == 0 )
delete this;
return m_cRefCount;


Perfectly valid, and good OOP if you know how things have to be allocated (via CoCreateInstance, or whatever), IMO.

I like pie.

Share this post


Link to post
Share on other sites
superpig    1825
quote:
Original post by RenderTarget

if( -- m_cRefCount == 0 )
delete this;
return m_cRefCount;




Though of course, if you take that fallthrough approach, you''d probably want to save m_cRefCount to a temporary variable; who knows whether it will still be valid after deletion...

Superpig
- saving pigs from untimely fates, and when he''s not doing that, runs The Binary Refinery.
Enginuity1 | Enginuity2 | Enginuity3 | Enginuity4

Share this post


Link to post
Share on other sites
Sneftel: No, suicide is never a solution

Having a private constructor? Ok, give me an example of this.

Ok, it might be useful but there must be better solutions and c++ is not really OO. But it''s like when I see a printf-statement in c++ code, I still go bezerk.

Share this post


Link to post
Share on other sites
JohnBolton    1372
quote:
Original post by Corrail
Just wanted to know if this command is legal in a method of a class of struct:

delete this;



It is legal, but it is rarely a good thing to do.

Share this post


Link to post
Share on other sites
Queasy    157
sorry, i know this is an old thread but someone asked why one would ever use a private constructor. one good example of this is when implementing the singleton design pattern.

-j

Share this post


Link to post
Share on other sites
Sneftel    1788
They''ll be happy to hear that.


"Sneftel is correct, if rather vulgar." --Flarelocke

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.