Подтвердить что ты не робот

"удалить это" в конструкторе

Что на самом деле происходит при выполнении этого кода?

class MyClass
{
    MyClass()
    {
        //do something
        delete this;   
    }
}
4b9b3361

Ответ 1

Оказывается, что в этом конкретном случае код является законным, но вы находитесь & epsilon; -выход от поведения undefined.

Стандарт С++ определяет понятие "время жизни" объекта как время, в течение которого его конструктор завершил работу, и когда деструктор начинает работать. В нем также четко указывается (в разделе 3.8/5), что

До начала жизни объекта [...] Если объект будет или имеет тип класса с нетривиальным деструктором, а указатель используется как операнд выражения-удаления, программа имеет поведение undefined.

Так как время жизни объекта не началось до тех пор, пока конструктор не закончит, внутри конструктора указатель this, о котором вы говорили, еще не приступил к его жизни, попытка delete в этом случае полностью безопасна. Однако, если вы напишете деструктор для класса, вы тут же столкнетесь с поведением undefined.

Кроме того, если вы измените конструктор, чтобы попытаться ссылаться на какой-либо элемент данных класса после удаления объекта, вы получите поведение undefined. Если объект был выделен в стеке, вы получите поведение undefined. Если объект был статичным, вы получите поведение undefined. Если объект был выделен с помощью new, то указатель, который клиент вернет к нему, будет недействительным, и использование его приведет к поведению undefined. В общем, не пытайтесь это делать!

Ответ 2

Предполагая, что ваш объект никогда не наследуется ничем, это должно работать нормально. Ваш конструктор запускается, а затем деструктор немедленно вызывается. Если что-то наследует этот объект, он сломается, так как этот конструктор будет вызываться перед наследующим конструктором.