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

Calling destructor to free dynamically allocated memory

本文关键字:内存 动态分配 释放 析构函数 调用      更新时间:2023-10-16

让我们考虑以下代码:

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

我想知道p所指向的物体A记忆是否被释放,或者我们必须调用delete p;

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

内存是使用运算符 new 分配的,将使用运算符 delete(而不是对象的析构函数(释放(解除分配(。

我们不应该将对象生存期与动态内存管理混淆。

释放分配的内存不是A'析构函数角色,不应显式调用它。它只是一个成员函数,当您的对象被销毁会调用它。打电话给delete后它会被摧毁.

取代:

p->~A();

跟:

delete p;

现在,您的对象将被销毁,分配的内存将被解除分配。

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