【问题标题】:Calling destructor to free dynamically allocated memory调用析构函数释放动态分配的内存
【发布时间】:2020-05-25 04:59:08
【问题描述】:

让我们考虑这段代码:

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

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

【问题讨论】:

  • 你不应该显式调用析构函数。
  • 不,它只是调用析构函数。 delete 调用析构函数并释放内存。

标签: c++ destructor dynamic-memory-allocation


【解决方案1】:

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

我们不应将object lifetimedynamic memory management 混淆。

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

替换:

p->~A();

与:

delete p;

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-07-16
        • 1970-01-01
        • 2011-03-17
        • 2016-07-16
        • 2016-10-25
        • 1970-01-01
        • 2013-11-22
        • 1970-01-01
        相关资源
        最近更新 更多