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

2024-02-08

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

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

private:
    int *p;
};
{
    Foo a(4);
}

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

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

private:
    int *p;
};

Foo::~Foo() {
    delete p;
}

我们在堆上分配的任何内存使用new must总是通过使用关键字来释放delete.

所以,你必须明确地释放分配的内存new使用关键字在堆上delete就像你在析构函数中所做的那样。合成的析构函数不会为你做这件事。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐