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

时间:2012-04-23 23:40:48

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

初始化shared_ptr成员变量时:

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

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

// .cpp
Customer():
  something_(new OtherClass())
{
}

VS

Customer():
  something_(std::make_shared<OtherClass>())
{
}

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

2 个答案:

答案 0 :(得分:13)

<{1}} 的唯一时间是:

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

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

  3. 是的,你可以这样做。

答案 1 :(得分:3)

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

我不确定我是否真的很清楚,这是GotW #103的目的,阅读它,在那里得到了很好的解释。