std :: shared_ptr例外安全

时间:2013-11-18 17:04:34

标签: c++ c++11 memory-leaks shared-ptr

我刚刚意识到阅读this page std :: shared_ptr的构造函数与单个指针参数不是noexcept。

因此,以下代码包含可能的内存泄漏:

std::shared_ptr<int> p3 (new int);

原因是可能发生两次分配:

  • 调用构造函数之前的第一个
  • shared_ptr构造函数中的第二个(例如,这是VS 2012中发生的事情)

这里有两个问题:

如果第二次分配引发异常,那么第一次分配的内存是否会泄漏?

如果答案是肯定的:

使用std :: shared_ptr的正确习惯是什么?

  • 使用make_shared
  • 将第一个分配的所有权授予std :: unique_ptr,然后转让所有权
  • 其他想法?

2 个答案:

答案 0 :(得分:29)

template<class Y> explicit shared_ptr(Y* p);
     

[util.smartptr.shared.const] / 6 抛出bad_alloc,或者当内存以外的资源无法执行时,执行定义的异常获得。
   [util.smartptr.shared.const] / 7 异常安全:如果抛出异常,则会调用delete p

所以不,没有内存泄漏。

答案 1 :(得分:11)

最新答案,但最好使用make_shared()来实现异常安全,如 GotW #102中所述:以下代码异常安全:

 f( std::shared_ptr<T1>{ new T1 }, std::shared_ptr<T2>{ new T2 } );

以下是:

f( std::make_shared<T1>(), std::make_shared<T2>() );