我听说过,对于原语,当它们超出范围时会发生“自动”清理,但这不会发生在类或结构上。这是真的吗?
例如:
$this->id;
VS
int * i = new int[5];
我听到了两种方式,并试图确定哪种方法是正确的。
答案 0 :(得分:2)
我听说过,对于原语,当它们超出范围时会发生“自动”清理,但这不会发生在类或结构上。这是真的吗?
不,那是不正确的。存储类型以及对象是否是内置类型在C ++中是完全正交的概念。如果对象具有自动存储,则退出其范围时会发生“清理”,无论其类型如何。
在发布的两个示例中,必须调用delete[]
和delete
来释放动态分配的内存并调用任何需要调用的析构函数。
答案 1 :(得分:1)
很容易记住。每当调用new
时,必须调用delete
。因为new int[5]
在堆上保留了5个整数值的内存,所以必须在某个时候释放它
同样适用于new Foo
,它会在堆上重置一个Foo
内存。 (然后调用构造函数等)
要在堆栈上保留内存,请使用以下格式:
{
int fiveInts[5];
Foo foo;
//valid here
}
//foo's destructor has been called
//and fiveInts is out of scope (but has no destructor (practically speaking))