为什么不为对象数组调用析构函数
Why destructor is not called for an array of objects?
我有一个由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;
相关文章:
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常