Что на самом деле происходит при выполнении этого кода?
class MyClass
{
MyClass()
{
//do something
delete this;
}
}
Что на самом деле происходит при выполнении этого кода?
class MyClass
{
MyClass()
{
//do something
delete this;
}
}
Оказывается, что в этом конкретном случае код является законным, но вы находитесь & epsilon; -выход от поведения undefined.
Стандарт С++ определяет понятие "время жизни" объекта как время, в течение которого его конструктор завершил работу, и когда деструктор начинает работать. В нем также четко указывается (в разделе 3.8/5), что
До начала жизни объекта [...] Если объект будет или имеет тип класса с нетривиальным деструктором, а указатель используется как операнд выражения-удаления, программа имеет поведение undefined.
Так как время жизни объекта не началось до тех пор, пока конструктор не закончит, внутри конструктора указатель this
, о котором вы говорили, еще не приступил к его жизни, попытка delete
в этом случае полностью безопасна. Однако, если вы напишете деструктор для класса, вы тут же столкнетесь с поведением undefined.
Кроме того, если вы измените конструктор, чтобы попытаться ссылаться на какой-либо элемент данных класса после удаления объекта, вы получите поведение undefined. Если объект был выделен в стеке, вы получите поведение undefined. Если объект был статичным, вы получите поведение undefined. Если объект был выделен с помощью new
, то указатель, который клиент вернет к нему, будет недействительным, и использование его приведет к поведению undefined. В общем, не пытайтесь это делать!
Предполагая, что ваш объект никогда не наследуется ничем, это должно работать нормально. Ваш конструктор запускается, а затем деструктор немедленно вызывается. Если что-то наследует этот объект, он сломается, так как этот конструктор будет вызываться перед наследующим конструктором.