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