delete this
не является правильным способом вызова деструктора в современном коде. В общем, вам не нужно вызывать деструктор: их магия в том, что они вызываются в нужное время:
struct A {
~A() { std::cout << "running destructor\n"; }
};
int main()
{
A a;
return 0;
}
delete
во всех случаях - для освобождения памяти, выделенной new
. delete this
вызовет проблему, когда объект не был выделен new
:
struct B {
~B() { delete this }
};
int main()
{
B b;
return 0;
}
Это приведет к сбою вашей программы практически на всех платформах с реальной операционной системой («почти все», потому что это технически неопределенное поведение, и программе, соответствующей стандартам, разрешено повреждать себя и продолжать работу в этом случае, держите пальцы подальше что ваша платформа делает больше, чем просто позволяет вам работать вместе с поврежденными структурами данных управления памятью и неверным стеком).
Размещение new
в основном предназначено для драйверов устройств или других мест, где указатель должен быть размещен по специальному адресу. Как правило, вы не хотите уничтожать объекты, размещенные при размещении new
. В тех случаях, когда вы хотите, просто позвоните деструктору напрямую:
My_object* o = new(0xffff) My_object();
o->~My_object();
Но, помните, Бьярн Страуструп сказал: «Следует по возможности избегать явных вызовов деструкторов. Иногда они необходимы. коллега, прежде чем сделать это "( Язык программирования C ++ , 10.4.11).