Arn*_*aud 30 c++ memory-leaks shared-ptr c++11
我刚刚意识到阅读这个页面,std :: shared_ptr的构造函数与单个指针参数不是noexcept.
因此,以下代码包含可能的内存泄漏:
std::shared_ptr<int> p3 (new int);
Run Code Online (Sandbox Code Playgroud)
原因是可能发生两次分配:
这里有两个问题:
如果第二个分配抛出异常,第一个分配的内存泄漏,这是真的吗?
如果答案是肯定的:
使用std :: shared_ptr的正确习惯用法是什么?
Igo*_*nik 29
Run Code Online (Sandbox Code Playgroud)template<class Y> explicit shared_ptr(Y* p);
[util.smartptr.shared.const]/6 当无法获取内存以外的资源时,抛出:
bad_alloc
或实现定义的异常.
[util.smartptr.shared.const]/7 异常安全:如果抛出异常,delete p
则调用.
所以不,没有内存泄漏.
Tho*_*ire 11
迟到的答案,但最好make_shared()
用于异常安全,如
GotW#102中所述:以下代码不是异常安全的:
f( std::shared_ptr<T1>{ new T1 }, std::shared_ptr<T2>{ new T2 } );
Run Code Online (Sandbox Code Playgroud)
以下是:
f( std::make_shared<T1>(), std::make_shared<T2>() );
Run Code Online (Sandbox Code Playgroud)