[英]std::shared_ptr Exception Safety
我刚刚在阅读此页面时意识到带有单个指针参数的std::shared_ptr
的构造函数不是 noexcept 。
因此,以下代码包含可能的内存泄漏:
std::shared_ptr<int> p3 (new int);
原因是可能发生两种分配:
这里有两个问题:
如果第二个分配抛出异常,第一个分配的内存是否泄漏,这是真的吗?
如果答案是肯定的:
使用 std::shared_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.