繁体   English   中英

std::shared_ptr 异常安全

[英]std::shared_ptr Exception Safety

我刚刚在阅读此页面时意识到带有单个指针参数的std::shared_ptr的构造函数不是 noexcept 。

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

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

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

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

这里有两个问题:

如果第二个分配抛出异常,第一个分配的内存是否泄漏,这是真的吗?

如果答案是肯定的:

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

  • 使用 make_shared
  • 将第一次分配的所有权赋予 std::unique_ptr 然后转移所有权
  • 其他想法?
template<class Y> explicit shared_ptr(Y* p);

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

所以不,没有内存泄漏。

迟到的答案,但最好使用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>() );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM