我遇到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?
答案 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 ;;它们只是具有不同的语义,适用于不同的情况。