在the book The C++ Standard Library第91页,我读到了关于shared_from_this()
的内容:
问题是shared_ptr
将自己存储在Person
基类的私有成员enable_shared_from_this<>
中,在Person构造的末尾。
书中的相关代码片段是:
class Person : public std::enable_shared_from_this<Person> {
...
};
字符串
我不明白两件事:
1.这个存储自身的shared_ptr
是谁?
1.他如何在Person
的构造结束时将自身存储在任何地方?我认为Person
的构造以我编写的构造函数的最后一条语句结束。
我知道有一个weak_ptr
还没有初始化。
编辑:感谢Angew!shared_from_this
只有在第一个shared_ptr
到Person
被创建后才能工作。这个shared_ptr
将检查Person
类是否继承自enable_shared_from_this
,如果是,则初始化其内部的weak_ptr
。
2条答案
按热度按时间wlp8pajw1#
原因很简单:在对象
X
中,enable_shared_from_this
的工作方式是用指向对象X
的第一个shared_ptr
的副本初始化一个隐藏的weak_ptr
。然而,要使shared_ptr
能够指向X
,X
必须已经存在(它必须已经被构造了)。因此,当X
的构造函数正在运行时,还没有enable_shared_from_this
可以使用的shared_ptr
。以这段代码为例:
字符串
在调用
shared_ptr
的p
构造函数之前,必须计算其参数。该参数是表达式new Person()
。因此,Person
的构造函数在p
的构造函数开始之前运行-在enable_shared_from_this
可以绑定到任何shared_ptr
对象之前。lymgl2op2#
因此,当X的构造函数运行时,还没有enable_shared_from_this可以使用的shared_ptr。
但是当make_shared被调用时,可以访问一个控制块来创建一个weak_ptr before/while构造函数,因为它们是在与类相同的内存块中创建的。