构造函数中的weak_from_this()

Bjö*_*.P. 6 c++ constructor smart-pointers weak-ptr

我知道你不能shared_from_this在构造函数中使用。但是可以weak_from_this在构造函数中使用 new吗?根据 cppreference:

这是作为 enable_shared_from_this 一部分的私有可变 weak_ptr 成员的副本。

http://en.cppreference.com/w/cpp/memory/enable_shared_from_this/weak_from_this

我没有看到从构造函数中获取内部存储的 weak_ptr 副本的问题,但我可能会遗漏一些东西,所以我不确定这一点。

asc*_*ler 5

您可以调用它,但weak_ptr通常只是空的。

的重点shared_from_this不仅仅是制作 some shared_ptr,而是获得shared_ptr与现有shared_ptr指针集共享所有权的a 。重点weak_ptr是提供一种获取 a 的方法,shared_ptr如果shared_ptr当时存在其他指针,则共享所有权,而无需像直接存储 a will 那样延长生命周期shared_ptr。因此,如果不存在shared_ptr指向该对象的指针,则 aweak_ptr不能指向同一个对象。

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

std::shared_ptr<MyClass> p(new MyClass);
Run Code Online (Sandbox Code Playgroud)

顺序是:

  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_ptrstd::make_shared和期间发生了类似的 重新分配std::allocate_shared。在这种情况下,该标准没有明显说的weak_ptr是完整的指针指向的对象被创建后分配,但它是非常不寻常和意想不到的实现去额外的努力以某种方式奇迹般地做一些事情的weak_ptr一些指向构造enable_shared_from_this基子对象和执行派生类构造函数主体之间。]

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

  • 我知道复制的 weak_ptr 最初将是空的。问题是我不明白weak_ptr 的实际工作原理。我认为一个 weak_ptr 的副本,即使它一开始是空的,一旦原始的 weak_ptr 也变得有效,它也会变得有效。好像两个 weak_ptr 都有对同一个指针的引用,那最初可能是 **nullptr**,但在某个时候会变得有效,并且所有weak_ptr 引用这个指针也将变得有效。看起来,这不是他们的工作方式。 (3认同)