我刚刚意识到阅读this page std :: shared_ptr的构造函数与单个指针参数不是noexcept。
因此,以下代码包含可能的内存泄漏:
std::shared_ptr<int> p3 (new int);
原因是可能发生两次分配:
这里有两个问题:
如果第二次分配引发异常,那么第一次分配的内存是否会泄漏?
如果答案是肯定的:
使用std :: shared_ptr的正确习惯是什么?
答案 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>() );