The following code compiled with MSVC9.0 runs and outputs Destructor four times, which is logical.
#include
class SomeClass
p->~SomeClass(); //line 5
p->CommitSuicide(); //line 6
Line (6) definitely invokes Undefined Behaviour.
That is, is invocation of another member after the explicit call of the destructor allowed (defined)?
No! Your assumption is correct.
"delete this" is ok as long as you do not attempt to call any code of that object after the deletion (not even the destructor). So a self deleting object shoud only be placed at the heap and shoud have a private destructor to protect from creation on the stack.
I dont know if a direct call to the destructor leads to undefined behaviour but a userdefined delete-operator would'nt get executed.
The delete this;
is fine. The last p->CommitSuicide();
gives undefined behavior because you already destroyed the object in "line 5".