Давайте рассмотрим этот код:
#include <iostream> class A{ public: ~A() {} }; int main(){ A *p = new A(); p->~A(); return 0; }
Я хотел бы знать, освобождена ли память объекта A, на который указывает p, или мы должны вызвать delete p;
A
p
delete p;
Память не была освобождена. Деструктор уничтожает объект, но не освобождает память. Как это могло? Вы можете уничтожать объекты, которые динамически размещаются, находятся в стеке, являются глобальными и т. Д. Деструктор понятия не имеет, что нужно, если вообще что-то для освобождения памяти.
Память была выделена с помощью оператора new и будет освобождена (освобождена) с помощью оператора delete , а не деструктора вашего объекта.
Не следует путать время жизни объекта с динамика c управление памятью .
Это не A' s деструктор роль для освобождения выделенной памяти, и он не должен вызываться явно. Это просто функция-член, которая вызывается , когда ваш объект уничтожается. И он будет уничтожен после того, как вы позвоните delete.
A'
delete
Заменить:
p->~A();
на:
Теперь ваши объекты уничтожаются, а выделенная память освобождается.
Нет разницы между вызовом деструктора или любой другой функции-члена, за исключением одного - вы не должны этого делать, если только вы не хотите отделить распределение объекта от его построения и уничтожения.