为什么析构函数不会被调用为一个对象数组?

时间:2013-11-18 22:57:40

标签: c++

我有一个包含10个对象的数组。在下面编写的代码中,构造函数被调用11次,但析构函数只被调用1次。为什么构造函数被调用对象数组而不是析构函数?

#include <iostream>
using namespace std;

class A
{
public:
   A()
  {
       cout<<"ctor called"<<endl;
  }

  ~A()
  {
       cout<<"Destructor called"<<endl;
  }

};

int main()
{
    A *a = new A[10];

    A v;
}

上面的代码打印“ctor叫”11次,“析构者叫”1次,为什么这样?

3 个答案:

答案 0 :(得分:5)

您必须删除使用new分配的项目,它不会自动发生。

int main()
{
    A *a = new A[10];
    delete[] a;
    A v;
}

现在析构函数将被调用11次。

答案 1 :(得分:2)

您需要在数组上调用delete,因为它是使用new分配的。防爆。 delete[] a;

v在函数中本地分配,因此在函数末尾自动调用析构函数。

答案 2 :(得分:0)

这两个陈述之间存在很大差异

A *a = new A[10];

A v;

v是一个局部变量。当控件退出此代码块时,编译器本身会插入适当的代码来删除此对象。对于动态分配的数组,除了你自己以外没有人会打扰它没有被删除。程序完成后,操作系统只需将其标记为可以将其提供给其他程序即可。所以你应该使用operator

明确释放这个内存
delete []a;