初始化shared_ptr成员变量,new vs make_shared?

Use*_*ser 6 c++ initializer shared-ptr make-shared c++11

初始化shared_ptr成员变量时:

// .h
class Customer
{
public:
  Customer();

private:
  std::shared_ptr<OtherClass> something_;
}

// .cpp
Customer():
  something_(new OtherClass())
{
}
Run Code Online (Sandbox Code Playgroud)

Customer():
  something_(std::make_shared<OtherClass>())
{
}
Run Code Online (Sandbox Code Playgroud)

是否允许使用make_shared版本?我似乎总是看到第一个版本,这是首选?

Nic*_*las 13

当唯一的时间make_shared容许有:

  1. 如果您正在获取由其他人分配的裸指针并将其存储在其中shared_ptr.在与C API连接时经常会出现这种情况.
  2. 如果要调用的构造函数不是公共的(make_shared只能调用公共构造函数).这可能发生在工厂函数中,您希望强制用户从工厂创建对象.

    但是,有办法解决这个问题.没有私有构造函数,而是拥有一个公共构造函数.但是,使构造函数采用只能由具有私有访问权限的类构造的类型.这样,唯一可以make_shared使用该对象类型调用的人是具有私有访问权限的人.

所以,是的,你可以做到这一点.


Ufl*_*lex 5

在这种情况下,make_shared不仅允许使用,而且最好使用它。如果您使用 new,它将在某处为您的 Customer 分配内存,然后在其他地方为您的 shared_ptr 分配内存,存储强引用和弱引用(用于弱指针和共享指针)。如果您使用 ,make_shared您将在内存中只有一个地方包含所有内容,因此只有一个新位置。

我不确定我是否真的清楚,这是GotW #89的目的,阅读它,那里有很好的解释。