为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 3169 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信