【发布时间】:2012-10-04 22:43:52
【问题描述】:
我刚刚开始使用 c++ boost 库。我在很多地方读到,当使用 scoped_ptr 时,即使出现异常,对象也总是会被销毁。
我尝试了以下代码。
#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 类的析构函数
【问题讨论】:
标签: c++ exception boost destructor scoped-ptr