我一直在查看我正在处理的一些代码,我们有这样的等价物:
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 (),并且一次由 x 的析构函数。
现在,是否有解决此问题的 C++ 习惯用法,例如,编写调用负责清理参数的构造函数的代码?我见过的大多数代码似乎都没有这样做......