从堆栈和堆

时间:2016-04-05 19:08:16

标签: c++ constructor destructor allocation

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

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

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;
}

是否需要解除分配非动态分配的内存或更好地将其留给垃圾收集器?

1 个答案:

答案 0 :(得分:8)

这不是有点的问题。你根本无法释放你没有分配的记忆。

delete [] myBoxArray; // Delete array

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

您只能delete您执行的new内容,而delete[]只能new[]您执行// Draw faint arcs for each day (weekends filled, else outlined). vis.selectAll("g.AllDays") .data(dates) .enter().append("svg:g") .attr("class", "AllDays") .attr("transform", "translate(" + r1 + "," + r1 + ")") .append("svg:path") .attr("stroke", function(d, i) { return d3.hsl(0,0.25,0.75) }) .attr("fill", function(d, i) { return (d.getDay()==5||d.getDay()==6)?"#cccccc":"#ffffff"; }) .attr("d", arc) ; 的内容。任何违反此规则的行为都会导致程序行为异常。