私が取り組んでいるいくつかのコードを見てきましたが、これと同等のものがあります:
AutoPtr<A> x;
...
/// x gets initialized
...
B* y = new B(x.Detach());
ここで、AutoPtr は auto_ptr のバージョンであり、Detach() は所有されているポインターを返し、それ自体をリセットします。また、B() は x の所有権を取得します。
ここで、new が std::bad_alloc をスローすると x がリークすることに気付いたので、コードを次のように変更しました。
AutoPtr<A> x;
...
/// x gets initialized
...
B* y = new B(x.Get());
x.Detach();
しかし、その後、B() がポインターを「所有」し、その構築中に例外が発生した場合、パラメーター自体を削除する必要がある (またはそうすべきか?) ため、x は B によって 1 回、2 回削除されることに気付きました。 ()、および x のデストラクタによって 1 回。
さて、この問題を回避する C++ イディオムはありますか? たとえば、コンストラクターを呼び出してパラメーターのクリーンアップを担当するコードを作成しますか? 私が見たほとんどのコードはそうではないようです...