6
我讀手動說(見http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared):爲什麼在使用shared_ptr作爲函數參數時存在內存泄漏?
此外,
f(shared_ptr<int>(new int(42)), g())
可導致存儲器泄漏 如果g拋出異常。如果使用make_shared爲 ,則不存在此問題。
爲什麼會導致內存泄漏?
我讀手動說(見http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared):爲什麼在使用shared_ptr作爲函數參數時存在內存泄漏?
此外,
f(shared_ptr<int>(new int(42)), g())
可導致存儲器泄漏 如果g拋出異常。如果使用make_shared爲 ,則不存在此問題。
爲什麼會導致內存泄漏?
編譯器允許評估以下順序的表達:
auto __temp1 = new int(42);
auto __temp2 = g();
auto __temp3 = shared_ptr<int>(__temp1);
f(__temp3, __temp2);
你可以看到,如果g()
拋出,那麼分配的對象永遠不會被刪除。
使用make_shared
,在分配對象和初始化智能指針來管理它之間什麼也不能。
+1。是的,這就是我正要寫這篇文章的原因,但我首先談到了構造函數,然後就搞砸了。 – Nawaz