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

C++ 为什么不为对象数组调用析构函数?,c++,C++,我有一个10个对象的数组。在下面编写的代码中,构造函数被调用11次,而析构函数只被调用1次。为什么为对象数组调用构造函数而不是析构函数 #include <iostream> using namespace std; class A { public: A() { cout<<"ctor called"<<endl; } ~A() { cout<<"Destructor called"<&

我有一个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;
}
#包括
使用名称空间std;
甲级
{
公众:
()
{

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


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

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


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

您必须删除分配了new的项,它不会自动发生

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

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

您必须删除分配给new的项,它不会自动发生

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

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

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

A *a = new A[10];

A v;
v是一个局部变量。当控件退出此代码块时,编译器本身会插入适当的代码来删除此对象。对于动态分配的数组,除了您自己,没有人会担心它没有被删除。当程序完成时,操作系统只会将其标记为自由,以便能够将其提供给其他pr所以应该由您使用运算符显式释放此内存

delete []a;

这两种说法有很大区别

A *a = new A[10];

A v;
v是一个局部变量。当控件退出此代码块时,编译器本身会插入适当的代码来删除此对象。对于动态分配的数组,除了您自己,没有人会担心它没有被删除。当程序完成时,操作系统只会将其标记为自由,以便能够将其提供给其他pr所以应该由您使用运算符显式释放此内存

delete []a;

当使用
new
在空闲存储(堆)上进行分配时,您可以通过调用
delete
delete[]来解除分配(即调用析构函数)内存
在你的例子中。你的第二个实例,或
一个v
在堆栈上被本地分配,这意味着当变量超出范围时,构造函数和析构函数会被自动调用,在你的例子中,它位于下一行,即在空闲存储(堆)上分配时,在闭括号
}
之后通过使用
new
,您可以通过调用
delete
delete[]
在你的例子中。你的第二个实例,或
一个v
在堆栈上被本地分配,这意味着当变量超出范围时,构造函数和析构函数会被自动调用,在你的例子中,它位于下一行,即在闭括号
}
之后。