【发布时间】:2012-10-10 00:19:36
【问题描述】:
我一直在查看我正在处理的一些代码,我们有类似的代码:
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++ 习惯用法,例如,编写调用负责清理参数的构造函数的代码?我见过的大多数代码似乎都没有这样做......
【问题讨论】:
-
我假设
B*实际上是AutoPtr<B>? -
哈哈,不,它不是,因为它被传递给另一个函数,该函数在下一行获得它的所有权。
标签: c++ exception-safety