为什么当我们使用关键字创建对象时不调用析构函数"NEW"?
Why the destructor is not being called when we create object with "NEW" keyword?
我创建了一个具有一个构造函数和析构函数的类。在main函数中,我创建了一个指针,并使用"new"关键字初始化我的类。
#include <iostream>
using namespace std;
class RAVI
{
public:
RAVI()
{
cout<<"in constructor"<<endl;
}
~RAVI()
{
cout<<"in Distructor"<<endl;
}
};
int main()
{
RAVI *p;
try{
p= new RAVI();
cout<<"throughng object"<<endl;
throw 6;
}
catch(...)
{
cout<<"Caught exception"<<endl;
}
cout<<"end of try-catch block"<<endl;
return 0;
}
输出:
<>之前在构造函数throughng对象捕获异常try-catch块结束之前通常析构函数应该在抛出异常之前调用。但在下面的例子中,为什么它没有发生??请澄清我的疑问?
通常析构函数应该在抛出异常 之前调用错
。对象在堆中分配,并将驻留在内存中,直到程序终止。如果您使用stack在 try
块中创建对象,那么它将在该块结束时被销毁,但在 throw
语句之后仍然。
try{
RAVI p;
cout<<"throughng object"<<endl; throw 6; }
catch(...)
{
cout<<"Caught exception"<<endl;
}
输出:in constructor
throughng object
in Distructor
Caught exception
end of try-catch block
我猜你假设"通常析构函数应该在抛出异常之前调用",因为知道如果抛出异常,堆栈将展开并销毁在该作用域中创建的所有对象。但是对于驻留在堆栈而不是堆中的对象(包括指针,但不包括指向对象)来说,这是正确的。这就是使用智能指针而不是原始指针的动机,这样当堆栈展开时,堆对象也将被销毁。
所有离开作用域的局部变量的析构函数为调用。在您的例子中,没有任何局部变量离开作用域,因此不会调用析构函数。如果RAVI* p;
在try块,它的析构函数将被调用。但是,指针的析构函数是无操作的,所以你不能判断它是否
当你用new
创建一个对象时,你告诉要管理其生命周期的编译器。唯一一次它的析构函数将在你告诉编译器的时候被调用这样做,用delete
。
相关文章:
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常