gpt4 book ai didi

c++ - 在 scoped_ptr 出现异常时不调用析构函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:08:46 25 4
gpt4 key购买 nike

我刚刚开始使用 C++ boost 库。我在很多地方读到,当使用 scoped_ptr 时,即使出现异常,对象也总是被销毁。

They behave much like built-in C++ pointers except that they automatically delete the object pointed to at the appropriate time. Smart pointers are particularly useful in the face of exceptions as they ensure proper destruction of dynamically allocated objects.

我尝试了以下代码。

#include<boost/scoped_ptr.hpp>

class B
{
public:
B(){ std::cout<< "B constructor call\n"; }
~B(){ std::cout<<"B destructor call\n"; }
};

class A
{
public:
boost::scoped_ptr<B> b;
A():b(new B())
{
throw 1;
}
};

int main()
{
A a; return 0;
}

output:
B constructor call
terminate called after throwing an instance of 'int'
Aborted (core dumped)

没有调用 B 的析构函数。但是我使用了 scoped_ptr 所以它应该调用 B 的析构函数或者我误解了 scoped_ptr 的使用。

但是如果用 try catch 包围它,那么 B 的析构函数就会被调用。

try{
A a;
} catch( ... ) {
}

在这种情况下,A 的析构函数将被调用,因为在 try block 中出现异常的情况下,所有本地分配的对象都会从堆栈中删除,我将指针包裹在 scoped_ptr 的对象中,所以当作用域对象的析构函数销毁 which最终是指针。所以 scoped_ptr 很有用,因为我们不必显式删除分配的内存或者我误解了 scoped_ptr 的描述。

如果使用 scoped_ptr 发生异常,如何调用 B 类的析构函数

最佳答案

没有匹配的异常处理程序,所以 std::terminate 被直接调用,在这种情况下没有展开堆栈。在捕获 intmain 中放置一个 try/catch 并且你会看到你的析构函数调用,即使处理程序重新抛出。

C++11 §15.1/2:

When an exception is thrown, control is transferred to the nearest handler with a matching type; "nearest" means the handler for which the compound-statement or ctor-initializer following the try keyword was most recently entered by the thread of control and not yet exited.

和§15.3/9:

If no matching handler is found, the function std::terminate() is called; whether or not the stack is unwound before this call to std::terminate() is implementation-defined.

<子> Online demo

关于c++ - 在 scoped_ptr 出现异常时不调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12887495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com