我有一个没有析构函数和构造函数的类,如下所示:
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(使用前将#替换为@)