C++ 正在初始化共享的\u ptr成员变量,新建vs使\u共享?

C++ 正在初始化共享的\u ptr成员变量,新建vs使\u共享?,c++,c++11,shared-ptr,initializer,make-shared,C++,C++11,Shared Ptr,Initializer,Make Shared,初始化共享_ptr成员变量时: // .h class Customer { public: Customer(); private: std::shared_ptr<OtherClass> something_; } // .cpp Customer(): something_(new OtherClass()) { } /.h 类客户 { 公众: 客户(); 私人: std::共享的东西; } //.cpp 客户(): 某些内容(新的OtherClass())

初始化共享_ptr成员变量时:

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

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

// .cpp
Customer():
  something_(new OtherClass())
{
}
/.h
类客户
{
公众:
客户();
私人:
std::共享的东西;
}
//.cpp
客户():
某些内容(新的OtherClass())
{
}
vs

Customer():
something_u(std::make_shared())
{
}

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

唯一不允许
共享的时候是:

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

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


  • 因此,是的,您可以这样做。

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


    我不确定我是否真的很清楚,这是本书的目的,请阅读,这里有很好的解释。

    赫伯·萨特(Herb Sutter)刚刚就此写了一篇短文。请参阅并检查Herb没有明确说明。@RSamuelKlatchko-您在ansewer使用中提供的关于友谊问题的第一个链接的更新链接,标准中是否提到作为朋友使用的特定功能?我可以很好地想象一些实现将这项工作委托给助手函数…@MatthieuM.:我有点想知道同样的事情,这就是为什么我说“可能可以”。我已经问过COMP。我们看看他们会怎么说。如果不是的话,我认为这可能是一个不错的缺陷报告。
    Customer():
      something_(std::make_shared<OtherClass>())
    {
    }