为什么不为对象数组调用析构函数

Why destructor is not called for an array of objects?

本文关键字:调用 析构函数 数组 对象 为什么不      更新时间:2023-10-16

我有一个由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;
}

上面的代码打印了11次"ctor调用"和1次"Destructor调用",为什么这样???

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

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

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

您需要对数组调用delete,因为它是使用new分配的。示例delete[] a;

v是在函数中本地分配的,因此在函数结束时会自动调用析构函数。

这两个语句之间有很大的区别

A *a = new A[10];
A v;

v是一个局部变量。当控件退出此代码块时,编译器本身会插入适当的代码来删除此对象。至于动态分配的数组,那么除了你自己,没有人会为它没有被删除而烦恼。当程序完成时,操作系统只需将其标记为免费,就可以将其提供给其他程序。因此,您应该使用操作员明确释放此内存

delete []a;