c++ブーストライブラリを使い始めたばかりです。私は多くの場所で、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の使用を誤って解釈しました。
しかし、それをtry catchで囲むと、Bのデストラクタが呼び出されます。
try{
A a;
} catch( ... ) {
}
この場合、tryブロックで例外が発生した場合に、ローカルに割り当てられたすべてのオブジェクトがスタックから削除され、scoped_ptrのオブジェクトが内部にラップされているため、スコープオブジェクトのデストラクタが最終的にポインタを破棄すると、Aのデストラクタが呼び出されます。 。割り当てられたメモリを明示的に削除する必要がないか、scoped_ptrの説明を誤って解釈したため、scoped_ptrは便利です。
scoped_ptrを使用して例外が発生した場合に、クラスBのデストラクタを呼び出すにはどうすればよいですか。