构造函数中的 weak_from_this()



我知道你不能在构造函数中使用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_ptrweak_ptr的重点是提供一种获取shared_ptr的方法,如果当时存在其他shared_ptr指针,则共享所有权,而不会像直接存储shared_ptr那样延长生命周期。 因此,如果不存在指向对象的shared_ptr指针,则weak_ptr不能指向同一对象。

请注意,在正常使用中,当您执行类似操作时

std::shared_ptr<MyClass> p(new MyClass);

顺序为:

  1. 该实现调用operator new(sizeof(MyClass))以获取一些存储。

  2. 该实现调用MyClass的构造函数以在该存储中创建对象。

    • 如果MyClass继承了std::enable_shared_from_this,它包含一个std::weak_ptr子对象。weak_ptr的默认构造函数用于创建 一个空的智能指针。
  3. 该实现调用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_sharedstd::allocate_shared期间。 在这些情况下,标准并没有明显地说weak_ptr是在创建完整的指向对象之后分配的,但是在构造enable_shared_from_this基子对象和执行派生类构造函数体之间的某个时刻,实现会付出额外的努力以某种方式神奇地对weak_ptr做一些事情,这是非常不寻常和出乎意料的。

你可以创建一个std::shared_ptr,它指向类构造函数中的this,以将其存储在其他变量或容器或其他东西中。 (但是如果使用默认删除器,请确保您以某种方式知道该对象实际上是使用标量new创建的! 在那之后,shared_from_this()weak_from_this()都可以在构造函数中使用,并将返回连接到已创建的std::shared_ptr的内容。 但这似乎与正常的做事方式相当内在。

相关内容

  • 没有找到相关文章

最新更新