我知道你不能在构造函数中使用shared_from_this
。但是是否可以从构造函数中使用新weak_from_this
?根据 cpp 偏好:
这是私有可变weak_ptr成员的副本,该成员是一部分 的enable_shared_from_this。
http://en.cppreference.com/w/cpp/memory/enable_shared_from_this/weak_from_this
我认为从构造函数中获取内部存储weak_ptr的副本没有问题,但我可能缺少一些东西,所以我不确定这一点。
你可以调用它,但weak_ptr
通常只是空的。
shared_from_this
的重点不仅仅是做一些shared_ptr
,而是得到一个与现有shared_ptr
指针集共享所有权的shared_ptr
。weak_ptr
的重点是提供一种获取shared_ptr
的方法,如果当时存在其他shared_ptr
指针,则共享所有权,而不会像直接存储shared_ptr
那样延长生命周期。 因此,如果不存在指向对象的shared_ptr
指针,则weak_ptr
不能指向同一对象。
请注意,在正常使用中,当您执行类似操作时
std::shared_ptr<MyClass> p(new MyClass);
顺序为:
该实现调用
operator new(sizeof(MyClass))
以获取一些存储。该实现调用
MyClass
的构造函数以在该存储中创建对象。- 如果
MyClass
继承了std::enable_shared_from_this
,它包含一个std::weak_ptr
子对象。weak_ptr
的默认构造函数用于创建 一个空的智能指针。
- 如果
该实现调用
std::shared_ptr<MyClass>
的构造函数来创建智能指针,并将指针传递给MyClass
对象。shared_ptr
的构造函数检查指针是否指向继承兼容std::enable_shared_from_this
专用化的类类型。 如果是这样,则类对象中的std::weak_ptr
子对象被重新指定为正在构造的shared_ptr
的副本。
因此,在MyClass
的构造函数中,您将在步骤 2 中。但是shared_from_this()
和weak_from_this()
使用的内部指针直到步骤 3 才变得有用。
[类似的weak_ptr
重新分配发生在std::make_shared
和std::allocate_shared
期间。 在这些情况下,标准并没有明显地说weak_ptr
是在创建完整的指向对象之后分配的,但是在构造enable_shared_from_this
基子对象和执行派生类构造函数体之间的某个时刻,实现会付出额外的努力以某种方式神奇地对weak_ptr
做一些事情,这是非常不寻常和出乎意料的。
你可以创建一个std::shared_ptr
,它指向类构造函数中的this
,以将其存储在其他变量或容器或其他东西中。 (但是如果使用默认删除器,请确保您以某种方式知道该对象实际上是使用标量new
创建的! 在那之后,shared_from_this()
和weak_from_this()
都可以在构造函数中使用,并将返回连接到已创建的std::shared_ptr
的内容。 但这似乎与正常的做事方式相当内在。