初始化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版本?我似乎总是看到第一个版本,这是首选?
答案 0 :(得分:13)
<{1}} 的唯一时间是:
make_shared
中。在与C API接口时经常会出现这种情况。如果要调用的构造函数不是公共的(shared_ptr
只能调用公共构造函数)。这可能发生在工厂函数中,您希望强制用户从工厂创建对象。
然而,有办法解决这个问题。没有私有构造函数,而是拥有一个公共构造函数。但是,使构造函数采用只能由具有私有访问权限的类构造的类型。这样,唯一可以使用该对象类型调用make_shared
的人就是那些有私人访问该类的人。
是的,你可以这样做。
答案 1 :(得分:3)
在这种情况下,不仅允许使用make_shared
,而且最好使用它。如果您使用new,它将为您的Customer在某处分配内存,然后在其他地方为shared_ptr分配内存,同时存储强引用和弱引用(对于弱指针和共享指针)。如果您使用make_shared
,那么内存中只有一个位置,因此只有一个新位置。
我不确定我是否真的很清楚,这是GotW #103的目的,阅读它,在那里得到了很好的解释。