Вызов деструктора для освобождения динамически выделяемой памяти - PullRequest
0 голосов
/ 09 февраля 2020

Давайте рассмотрим этот код:

#include <iostream>
class A{
public:
        ~A() {}
};
int main(){
        A *p = new A();
        p->~A();
        return 0;
}

Я хотел бы знать, освобождена ли память объекта A, на который указывает p, или мы должны вызвать delete p;

Ответы [ 3 ]

5 голосов
/ 09 февраля 2020

Память не была освобождена. Деструктор уничтожает объект, но не освобождает память. Как это могло? Вы можете уничтожать объекты, которые динамически размещаются, находятся в стеке, являются глобальными и т. Д. Деструктор понятия не имеет, что нужно, если вообще что-то для освобождения памяти.

1 голос
/ 09 февраля 2020

Память была выделена с помощью оператора new и будет освобождена (освобождена) с помощью оператора delete , а не деструктора вашего объекта.

Не следует путать время жизни объекта с динамика c управление памятью .

Это не A' s деструктор роль для освобождения выделенной памяти, и он не должен вызываться явно. Это просто функция-член, которая вызывается , когда ваш объект уничтожается. И он будет уничтожен после того, как вы позвоните delete.

Заменить:

p->~A();

на:

delete p;

Теперь ваши объекты уничтожаются, а выделенная память освобождается.

0 голосов
/ 09 февраля 2020

Нет разницы между вызовом деструктора или любой другой функции-члена, за исключением одного - вы не должны этого делать, если только вы не хотите отделить распределение объекта от его построения и уничтожения.

...