delete this

Started by
13 comments, last by Corrail 20 years ago
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
--------------------------------------------------------There is a theory which states that if ever anybody discovers exactly what the Universe is for and why it is here, it will instantly disappear and be replaced by something even more bizarre and inexplicable.There is another theory which states that this has already happened...
Advertisement
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.
Okay, thanks. I''ll try it.

Corrail
corrail@gmx.at
ICQ#59184081
--------------------------------------------------------There is a theory which states that if ever anybody discovers exactly what the Universe is for and why it is here, it will instantly disappear and be replaced by something even more bizarre and inexplicable.There is another theory which states that this has already happened...
Object-oriented suicide as I like to call it.
--God has paid us the intolerable compliment of loving us, in the deepest, most tragic, most inexorable sense.- C.S. Lewis
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;
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.
And how do you know how the object was allocated?

My opinion: C++ should be more strict. Doing stuff like this is not really OO and it doesn''t really serve a purpose.
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.
--God has paid us the intolerable compliment of loving us, in the deepest, most tragic, most inexorable sense.- C.S. Lewis
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.
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.
[sub]My spoon is too big.[/sub]

This topic is closed to new replies.

Advertisement