C++ 为什么不为对象数组调用析构函数?
我有一个10个对象的数组。在下面编写的代码中,构造函数被调用11次,而析构函数只被调用1次。为什么为对象数组调用构造函数而不是析构函数C++ 为什么不为对象数组调用析构函数?,c++,C++,我有一个10个对象的数组。在下面编写的代码中,构造函数被调用11次,而析构函数只被调用1次。为什么为对象数组调用构造函数而不是析构函数 #include <iostream> using namespace std; class A { public: A() { cout<<"ctor called"<<endl; } ~A() { cout<<"Destructor called"<&
#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
在堆栈上被本地分配,这意味着当变量超出范围时,构造函数和析构函数会被自动调用,在你的例子中,它位于下一行,即在闭括号}
之后。