3 回答

TA貢獻1874條經驗 獲得超12個贊
共享指針管理對象本身,以及包含引用計數和其他管家數據的小對象。make_shared
可以分配單個內存塊來保存這兩個內存; 從指向已分配對象的指針構造共享指針將需要分配第二個塊來存儲引用計數。
除了這種效率之外,使用make_shared
意味著您根本不需要處理new
和原始指針,從而提供更好的異常安全性 - 在分配對象之后但在將其分配給智能指針之前不可能拋出異常。

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){}
};
- 3 回答
- 0 關注
- 3244 瀏覽
添加回答
舉報