【问题标题】:Assign a newly constructed shared_ptr分配一个新构建的 shared_ptr
【发布时间】:2017-01-04 05:02:12
【问题描述】:

遇到shared_ptr的一个问题,好像要初始化一个空的shared_ptr,引用std::shared_ptr: reset() vs. assignment有两种常用的方法

T {
  T(X x, Y y);
  ~T();

}
shared_ptr<T> p;
p.reset(new T(x,y));
p = make_shared<T>(t1) //t1 is a T type object

但是,为什么这不起作用?

 p = shared_ptr<T>(new T(x,y));

这只是一种不好的做法还是完全错误?谢谢!

有回答说make_shared在构造方面比new效率更高Is make_shared really more efficient than new?

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); //copy??
std::shared_ptr<Object> p2(new Object("foo")); //conversion?

【问题讨论】:

    标签: c++ c++11 shared-ptr


    【解决方案1】:

    但是,为什么这不起作用?

    p = shared_ptr<T>(new T(x,y));
    

    没关系。在链接的答案中就是这样使用的。

    当其他子表达式可能抛出异常时,将new 表达式转换为shared_ptr 是不安全的。由于未指定的评估顺序,可能会发生内存泄漏。但是new 作为命名变量的初始化器是安全的。

    std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); //copy??
    std::shared_ptr<Object> p2(new Object("foo")); //conversion?
    

    问题是shared_ptr 需要堆上的引用计数。 make_shared 能够将共享对象和引用计数组合到一个分配中,而转换需要一个预先存在的对象,因此需要再次调用 new 来进行计数。

    【讨论】:

      【解决方案2】:

      p = shared_ptr&lt;T&gt;(new T()) 只是一种不好的做法还是完全错误?

      您将 NULL 指针与指向默认构造对象的指针混淆了。 “对”或“错”都不是;它们只是具有不同的语义,适用于不同的情况。

      【讨论】:

      • 感谢您的回答,您介意进一步详细说明您的回答吗?我认为 shared_ptr p;将给出一个空指针,而后面的所有 3 行将分配一个由指针管理的对象,而我试图找出最后一个与前一个之间的区别?对不起,如果我的概念完全错误。
      猜你喜欢
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多