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