我有一个包含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次,为什么这样?
答案 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;