亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C ++中make_shared和普通shared_ptr的區別

C ++中make_shared和普通shared_ptr的區別

C++
MMTTMM 2019-09-18 11:14:47
std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");std::shared_ptr<Object> p2(new Object("foo"));許多google和stackoverflow帖子就在這里,但我無法理解為什么make_shared比直接使用更有效shared_ptr。有人可以一步一步解釋我創建的對象序列和兩者所做的操作,這樣我就能理解make_shared效率如何。我在上面給出了一個例子供參考。
查看完整描述

3 回答

?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

共享指針管理對象本身,以及包含引用計數和其他管家數據的小對象。make_shared可以分配單個內存塊來保存這兩個內存; 從指向已分配對象的指針構造共享指針將需要分配第二個塊來存儲引用計數。

除了這種效率之外,使用make_shared意味著您根本不需要處理new和原始指針,從而提供更好的異常安全性 - 在分配對象之后但在將其分配給智能指針之前不可能拋出異常。


查看完整回答
反對 回復 2019-09-18
?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

還有另一種情況,除了已經提到的兩種可能性之外,如果你需要調用非公共構造函數(受保護或私有),make_shared可能無法訪問它,而具有new的變體可以正常工作。


class A

{

public:


    A(): val(0){}


    std::shared_ptr<A> createNext(){ return std::make_shared<A>(val+1); }

    // Invalid because make_shared needs to call A(int) **internally**


    std::shared_ptr<A> createNext(){ return std::shared_ptr<A>(new A(val+1)); }

    // Works fine because A(int) is called explicitly


private:


    int val;


    A(int v): val(v){}

};


查看完整回答
反對 回復 2019-09-18
  • 3 回答
  • 0 關注
  • 3244 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號