weak_from_this() 在构造函数中

weak_from_this() within constructor

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

This is a copy of the the private mutable weak_ptr member that is part of 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);

顺序是:

  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 特化的 class 类型。如果是,则 class 对象中的 std::weak_ptr 子对象被重新分配为正在构造的 shared_ptr 的副本。

因此,在 MyClass 的构造函数中,您将进入第 2 步。但是 shared_from_this()weak_from_this() 使用的内部指针直到第 3 步才变得有用。

[weak_ptr 的类似重新分配发生在 std::make_sharedstd::allocate_shared 期间。在那些情况下,标准并没有明确地说 weak_ptr 是在创建完整的指向对象之后分配的,但是对于一个实现来说,付出额外的努力以某种方式神奇地做到这一点是非常不寻常和出乎意料的weak_ptr 在构建 enable_shared_from_this 基础子对象和执行派生的 class 构造函数主体之间的某个时刻。]

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