make_shared和shared_ptr的区别
生活随笔
收集整理的這篇文章主要介紹了
make_shared和shared_ptr的区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
struct A;
std::shared_ptr<A> p1 = std::make_shared<A>();
std::shared_ptr<A> p2(new A);
new Lhs() new Rhs() std::shared_ptr std::shared_ptr
上面兩者有什么區別呢? 區別是:std::shared_ptr構造函數會執行兩次內存申請,而std::make_shared則執行一次。
std::shared_ptr在實現的時候使用的refcount技術,因此內部會有一個計數器(控制塊,用來管理數據)和一個指針,指向數據。因此在執行std::shared_ptr<A> p2(new A)的時候,首先會申請數據的內存,然后申請內控制塊,因此是兩次內存申請,而std::make_shared<A>()則是只執行一次內存申請,將數據和控制塊的申請放到一起。那這一次和兩次的區別會帶來什么不同的效果呢?
異常安全
考慮下面一段代碼:
void f(std::shared_ptr<Lhs> &lhs, std::shared_ptr<Rhs> &rhs){...}f(std::shared_ptr<Lhs>(new Lhs()),std::shared_ptr<Rhs>(new Rhs()) );因為C++允許參數在計算的時候打亂順序,因此一個可能的順序如下:
此時假設第2步出現異常,則在第一步申請的內存將沒處釋放了,上面產生內存泄露的本質是當申請數據指針后,沒有馬上傳給std::shared_ptr,因此一個可能的解決辦法
auto lhs = std::shared_ptr<Lhs>(new Lhs()); auto rhs = std::shared_ptr<Rhs>(new Rhs()); f(lhs, rhs);而一個比較好的方法是使用std::make_shared。
f(std::make_shared<Lhs>(),std::make_shared<Rhs>() );make_shared的缺點
因為make_shared只申請一次內存,因此控制塊和數據塊在一起,只有當控制塊中不再使用時,內存才會釋放,但是weak_ptr卻使得控制塊一直在使用。
總結
以上是生活随笔為你收集整理的make_shared和shared_ptr的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全民K歌音效设置怎么关闭
- 下一篇: 刷新家庭网速极限!一大波Wi-Fi 7路