【问题标题】:Why shared_from_this can't be used in constructor from technical standpoint?从技术角度来看,为什么 shared_from_this 不能在构造函数中使用?
【发布时间】:2015-08-10 16:14:13
【问题描述】:

在第 91 页的 the book The C++ Standard Library 中,我读到了有关 shared_from_this() 的内容:

问题是shared_ptr 将自己存储在 Person 的基类,enable_shared_from_this<>在末尾​​strong> 人的构造。

书中相关代码sn-p为:

class Person : public std::enable_shared_from_this<Person> {
   ...
};

这里有两点我不明白:

  1. 谁是shared_ptr,它自己存储?
  2. 他如何在Person 的构造结束时将自己存储在任何地方?我认为Person 的构造以我编写的构造函数的最后一条语句结束。

我了解到有 weak_ptr 尚未初始化。

编辑: 感谢安吉! shared_from_this 只有在第一个 shared_ptrPerson 被创建后才能工作。这个shared_ptr 将检查Person 类是否继承自enable_shared_from_this,如果是,则初始化其内部weak_ptr

【问题讨论】:

  • 我没有意识到你可能只是在问这些Notes
  • @MarcoA。太好了,这些笔记真的很有帮助!

标签: c++ constructor shared-ptr


【解决方案1】:

原因很简单:在对象X 中,enable_shared_from_this 通过使用指向对象X 的第一个shared_ptr 的副本来初始化隐藏的weak_ptr。但是,要使shared_ptr 能够指向XX 必须已经存在(它必须已经构造)。因此,当X 的构造函数正在运行时,还没有enable_shared_from_this 可以使用的shared_ptr

获取这段代码:

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

pshared_ptr)的构造函数被调用之前,它的参数必须被计算。该参数是表达式new Person()。因此,Person 的构造函数在 p 的构造函数开始之前运行——在 enable_shared_from_this 可以绑定到任何 shared_ptr 对象之前。

【讨论】:

  • "...enable_shared_from_this works 通过初始化隐藏的weak_ptr 并使用指向对象shared_ptr 的第一个shared_ptr 的副本。" 什么程序负责初始化这个隐藏的@987654345 @?它如何知道指向X 的“第一个”shared_ptr 是什么?
  • @Chad 有关一些信息,请参阅此处的注释:en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
  • 谢谢@Holt。看起来shared_ptr 的构造函数负责初始化weak_ptr。只有那些采用原始指针(例如,从调用 new 返回的指针)的构造函数进行初始化。复制构造函数没有。由于只有第一个 shared_ptrX 应该从原始指针构造(其他通常是复制构造的),所以 weak_ptr 由第一个 shared_ptrX 初始化。
猜你喜欢
  • 2018-02-18
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2014-08-31
相关资源
最近更新 更多