【问题标题】:Deallocating memory from stack and heap从堆栈和堆中释放内存
【发布时间】:2016-07-25 21:41:58
【问题描述】:

如何释放为已知大小的数组存储的内存?

下面的代码打印了 4 次“构造函数调用!”但只有一次“调用了析构函数!”是否意味着整个数组的内存都被释放了?

class Box
{
   public:
      Box() { 
         cout << "Constructor called!" <<endl; 
      }
      ~Box() { 
         cout << "Destructor called!" <<endl; 
      }
};

int main( )
{
   Box myBoxArray[4];

   delete myBoxArray; // Delete array

   return 0;
}

但是如果我动态声明myBoxArray,如下代码所示,析构函数被调用了4次。

class Box
{
    public:
      Box() { 
         cout << "Constructor called!" <<endl; 
      }
      ~Box() { 
         cout << "Destructor called!" <<endl; 
      }
}; 

int main( )
{
   Box* myBoxArray = new Box[4];

   delete [] myBoxArray; // Delete array

   return 0;
}

是否有必要解除分配非动态分配的内存,或者最好将其留给垃圾收集器?

【问题讨论】:

  • 您的第一个示例显示了未定义的行为。你不能打电话给delete 以前不是newed 的东西。
  • c++中没有垃圾收集器

标签: c++ constructor destructor allocation


【解决方案1】:

这不是有没有意义的问题。你根本无法释放你没有分配的内存。

delete [] myBoxArray; // Delete array

具有未定义的行为 (UB),任何事情都可能发生。

你只能delete你所做的事情new,你只能delete[]你所做的事情new[]。任何违反此规则的行为都会导致程序行为不端。

【讨论】:

  • 你比我快 2 秒 :)。
  • 有什么方法可以从内存中删除不是new创建的数组/变量?
  • @AkkaJaworek:当执行退出它们声明的块时,它们会被自动删除。
  • @AkkaJaworek,编译器会处理这个问题。它是自动的,因此您不必考虑它。
  • 那么全局变量呢?
猜你喜欢
  • 1970-01-01
  • 2018-11-29
  • 2012-09-17
  • 2011-05-23
  • 2015-08-13
  • 1970-01-01
  • 2018-06-01
  • 2016-08-05
  • 2014-10-03
相关资源
最近更新 更多