在堆上分配时,在哪种情况下会发生“自动”清理(如果有的话),在哪种情况下不会?

时间:2015-10-25 21:32:34

标签: c++ memory-management

我听说过,对于原语,当它们超出范围时会发生“自动”清理,但这不会发生在类或结构上。这是真的吗?

例如:

      $this->id;

VS

int * i = new int[5];

我听到了两种方式,并试图确定哪种方法是正确的。

2 个答案:

答案 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))