LINUX.ORG.RU

История изменений

Исправление X512, (текущая версия) :

У вас объект - часть стекового фрейма и он удаляется вместе с удалением стекового фрейма при окончании функции (на самом деле ещё есть вложенные области видимости но не будем усложнять). Тоже самое будет с полем класса при удалении класса, у поля вызовется деструктор. Если нужно чтобы деструктор не вызывался, нужно использовать указатель и Myclass *xxx = new Myclass(). В таком случае удалить объект и вызвать деструктор можно будет в любом указанном месте.

Даже если вы сделаете чтобы деструктор не вызывался (например с помощью placement new) стековая память всё равно будет удалена по окончанию функции и будет перезаписана при вызове другой функции, так что пользоваться переменной на стеке после окончания функции нельзя.

Я же сам не удалял объект через delete.

delete применим только для объектов на куче (то, что создано с помощью new), а не для переменных на стековом фрейме или полей класса. Вы видимо путаете со скриптовыми языками вроде JavaScript или Python где всё является указателями и часто новые объекты создаются на куче без явного new, например a = {};.

★★★★

Неожиданный вопрос для четырёх звёзд.

Исходная версия X512, :

У вас объект - часть стекового фрейма и он удаляется вместе с удалением стекового фрейма при окончании функции (на самом деле ещё есть вложенные области видимости но не будем усложнять). Тоже самое будет с полем класса при удалении класса, у поля вызовется деструктор. Если нужно чтобы деструктор не вызывался, нужно использовать указатель и Myclass *xxx = new Myclass(). В таком случае удалить объект и вызвать деструктор можно будет в любом указанном месте.

Даже если вы сделаете чтобы деструктор не вызывался (например с помощью placement new) стековая память всё равно будет удалена по окончанию функции и будет перезаписана при вызове другой функции, та что пользоваться переменной на стеке после окончания функции нельзя.

Я же сам не удалял объект через delete.

delete применим только для объектов на куче (то, что создано с помощью new), а не для переменных на стековом фрейме или полей класса. Вы видимо путаете со скриптовыми языками вроде JavaScript или Python где всё является указателями и часто новые объекты создаются на куче без явного new, например a = {};.

★★★★

Неожиданный вопрос для четырёх звёзд.