分配新构建的shared_ptr

时间:2017-01-04 05:02:13

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

我遇到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在构造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?

2 个答案:

答案 0 :(得分: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才能进行计数。

答案 1 :(得分:0)

  

p = shared_ptr<T>(new T())只是一种不好的做法,还是完全错了?

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