为什么当我们使用关键字创建对象时不调用析构函数"NEW"?

Why the destructor is not being called when we create object with "NEW" keyword?

本文关键字:调用 析构函数 NEW 创建对象 我们 关键字 为什么      更新时间:2023-10-16

我创建了一个具有一个构造函数和析构函数的类。在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