What actually happen when I execute this code?
class MyClass
{
MyClass()
{
//do something
delete this;
}
}
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
Note: This answer applies to C++03, and it seems like the behavior was changed in C++11 and higher so that this is now undefined behavior.
It turns out that in this particular case the code is legal, but you’re ε-away from undefined behavior.
The C++03 standard defines the notion of the “lifetime” of an object to be the time between which its constructor has finished running and when the destructor starts running. It also explicitly states (in §3.8/5) that
Since an object’s lifetime has not started until the constructor finishes, inside the constructor the
thispointer you’ve referred to has not begun its lifetime, trying todeleteit in this case is totally safe. However, if you write a destructor for the class, then you’ll immediately run into undefined behavior here.In addition, if you change the constructor so that you try referencing any of the class’s data members after you delete the object, you’ll get undefined behavior. If the object was allocated on the stack, you’ll get undefined behavior. If the object was static, you’ll get undefined behavior. If the object was allocated using
new, then the pointer the client will get back to it will be invalid and using it will result in undefined behavior. In general, don’t try doing this!