11

初始化 shared_ptr 成员变量时:

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

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

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

对比

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

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

4

2 回答 2

14

唯一不允许make_shared的时间是:

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

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

所以是的,你可以这样做。

于 2012-04-23T23:51:52.190 回答
5

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

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

于 2012-04-25T10:26:11.767 回答