Пусть у меня есть класс:
class A
{
public:
int foo()
{
//some code before
delete this;
//some code after
return something;
}
};
Работаю я с ним, естественно, так:
A* a = new A();
auto result = a->foo();
Вопрос: гарантировано ли корректное выполнение блока кода после "delete this" с учетом того, что я не буду обращаться к переменным-членам класса после этой строчки?
Вызов функции-члена похож на вызов обычной функции, только для неё дополнительно происходит неявная инициализация this
указателем на тот объект, для которого эта функция вызвана. Поэтому, если Вы удаляете this
, но после этого к нему не обращаетесь, то и проблем у Вас быть не может.
https://isocpp.org/wiki/faq/freestore-mgmt#delete-this
Получается, что можно если:
Если нет обращение к членам прямо или косвенно, вызовов виртуальных функций, то проблемы быть не должно. Здесь надо понимать, что delete this;
вызывает деструктор и производит освобождение памяти в куче. Т.е. надо гарантировать, что объект создан через new
. В общем случае эквивалентный код (без foo
) мог бы выглядеть так:
A* a = new A();
//some code before
delete a;
//some code after
auto result = something
И здесь всё поведение (когда можно к кому обращаться) становится, на мой взгляд, очевидным.
В дополнение к ответу @alexolut - крайне рекомендовал бы сделать деструктор такого класса private
- это предупредит создание автоматических переменных такого класса, оставляя возможность создавать их динамически.
И небольшое IMHO - мне кажется, лучше воспользоваться интеллектуальным указателем, чем прятать удаление объекта в вызываемый метод - слишком легко потом запутаться, что к чему, какой метод удаляет объект, а какой - нет, и нарваться на неприятности...
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Есть ли что-нибудь похожее на Codecademy, но для C++? Для изучения языка интерактивно
Ищу аналоги https://codesandboxio или https://jsbin