我刚刚开始使用 c++ boost 库。我在很多地方读到,当使用 scoped_ptr 时,即使出现异常,对象也总是被销毁。
它们的行为很像内置的 C++ 指针,只是它们会在适当的时候自动删除指向的对象。智能指针在面对异常时特别有用,因为它们确保正确销毁动态分配的对象。
我尝试了以下代码。
#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 的使用。
但是如果 a 用 try catch 包围它,则调用 B 的析构函数。
try{
A a;
} catch( ... ) {
}
在这种情况下, A 的析构函数将被调用,因为在 try 块中出现异常的情况下,所有本地分配的对象都从堆栈中删除,并且我将指针包裹在里面和 scoped_ptr 的对象,所以当作用域对象的析构函数最终销毁指针时. scoped_ptr 也很有用,因为我们不必显式删除分配的内存,否则我误解了 scoped_ptr 的描述。
如果使用 scoped_ptr 发生异常,如何调用 B 类的析构函数