在抛出未处理的异常后过早离开的析构函数是否会释放成员数据?
Does a destructor that left prematurely after throwing an unhandled exception frees member data?
据我所知,析构函数的工作顺序与构造函数相反:
构造函数初始化成员数据(在 ctor-init 列表中)然后执行它的主体。
析构函数执行其主体然后销毁成员数据(在销毁阶段)。
我知道析构函数不应该抛出异常,如果它抛出异常,那么它应该自己处理该异常。
** 出于好奇:如果析构函数引发异常而没有在那里处理它,那么它应该销毁成员数据还是不释放它们? (因为它过早离开,因此跳过了销毁阶段)。
struct Bar{};
struct Foo{
~Foo()noexcept(false){
throw 1024;// leaves here prematurely
}
Bar b{};
};
那么 Foo
的 Dtor 在抛出后不处理异常就释放 b
了吗?
** 我知道我不应该那样做,只是为了更多地了解异常处理的工作原理。谢谢!
If a destructor raises an exception without handling it there then should it Destroy member data
是的。
So does Foo's Dtor frees b after throwing without handling the exception?
b
有一个简单的类型,所以它的“析构函数”什么都不做。但是,是的,该成员已被销毁。成员没有被“释放”。
我还没有尝试过,但是根据 C++ Primer,如果一个真正的 class 析构函数抛出而没有捕获到它自身的异常,那么就会调用 Terminate,结束程序。
据我所知,析构函数的工作顺序与构造函数相反:
构造函数初始化成员数据(在 ctor-init 列表中)然后执行它的主体。
析构函数执行其主体然后销毁成员数据(在销毁阶段)。
我知道析构函数不应该抛出异常,如果它抛出异常,那么它应该自己处理该异常。
** 出于好奇:如果析构函数引发异常而没有在那里处理它,那么它应该销毁成员数据还是不释放它们? (因为它过早离开,因此跳过了销毁阶段)。
struct Bar{};
struct Foo{
~Foo()noexcept(false){
throw 1024;// leaves here prematurely
}
Bar b{};
};
那么 Foo
的 Dtor 在抛出后不处理异常就释放 b
了吗?
** 我知道我不应该那样做,只是为了更多地了解异常处理的工作原理。谢谢!
If a destructor raises an exception without handling it there then should it Destroy member data
是的。
So does Foo's Dtor frees b after throwing without handling the exception?
b
有一个简单的类型,所以它的“析构函数”什么都不做。但是,是的,该成员已被销毁。成员没有被“释放”。
我还没有尝试过,但是根据 C++ Primer,如果一个真正的 class 析构函数抛出而没有捕获到它自身的异常,那么就会调用 Terminate,结束程序。