调用析构函数释放动态分配的内存

Calling destructor to free dynamically allocated memory

让我们考虑这段代码:

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

我想知道 p 指向的对象 A 的内存是否被释放,或者我们必须调用 delete p;

内存未释放。析构函数销毁对象但不释放内存。怎么可能呢?您可以销毁动态分配的对象、堆栈中的对象、全局对象等。析构函数不知道释放内存需要什么(如果有的话)。

调用析构函数或任何其他成员函数之间没有区别,除了一件事 - 你不应该这样做,除非你想将对象分配与其构造和销毁分开。

内存是使用运算符 new and will be freed (deallocated) using operator delete 分配的,而不是对象的析构函数。

大家不要混淆object lifetime with dynamic memory management

释放分配的内存不是A'destructor角色,不应显式调用。它只是一个成员函数,当 您的对象被销毁时,它会被调用 。它会在你调用 delete 后被销毁。

替换:

p->~A();

与:

delete p;

现在您的对象被销毁并且分配的内存被释放。