合成析构函数是否会破坏堆上分配的内存?

Kai*_*ain 4 c++ destructor heap-memory dynamic-memory-allocation

我有一个没有析构函数和构造函数的类,如下所示:

class Foo {
public:
    Foo(int a) : p(new int(a)) {}

private:
    int *p;
};
Run Code Online (Sandbox Code Playgroud)
{
    Foo a(4);
}
Run Code Online (Sandbox Code Playgroud)

这段代码之后,堆上分配的内存会被释放吗?或者我是否必须显式提供这样的析构函数:

class Foo {
public:
    Foo(int a) : p(new int(a)) {}
    ~Foo();

private:
    int *p;
};

Foo::~Foo() {
    delete p;
}
Run Code Online (Sandbox Code Playgroud)

use*_*570 5

我们在堆上分配的任何内存都new 必须始终使用关键字释放delete

因此,您必须像在析构函数中一样使用关键字显式释放堆上分配的内存。合成的析构函数不会为你做这件事。newdelete

请注意,如果您不想自己处理内存管理,那么您可以使用智能指针。这样您就不必delete自己显式使用,因为与智能指针对应的析构函数将负责释放内存。这本质上意味着如果指定的数据成员p是智能指针而不是普通(内置)指针,那么您不必delete p在类的析构函数中编写Foo