在书C++标准库第91页我读过关于
shared_from_this()
的内容:
问题在于
将自身存储在shared_ptr
的基类,Person
,在末尾 人的构建。enable_shared_from_this<>
书中的相关代码片段是:
class Person : public std::enable_shared_from_this<Person> {
...
};
我不明白这里的两件事:
shared_ptr
是谁?Person
结束时,他如何将自己存储在任何地方?我认为 Person
的构造以我编写的构造函数的最后一条语句结束。我明白还有
weak_ptr
还没有初始化。
编辑: 感谢安吉!仅在创建第一个
shared_from_this
至 shared_ptr
后,Person
才会起作用。这个shared_ptr
将检查Person
类是否继承自enable_shared_from_this
,如果是则初始化其内部weak_ptr
。
原因很简单:在对象
X
中,enable_shared_from_this
的工作原理是使用指向对象 weak_ptr
的第一个 shared_ptr
的副本初始化隐藏的 X
。然而,为了让 shared_ptr
能够指向 X
,X
必须已经存在(它必须已经被构造)。因此,当 X
的构造函数正在运行时,还没有 shared_ptr
可以使用的 enable_shared_from_this
。
拿这段代码:
std::shared_ptr<Person> p(new Person());
在调用
p
(shared_ptr
)的构造函数之前,必须评估其参数。该论证就是表达式 new Person()
。因此,Person
的构造函数在p
的构造函数开始之前运行——在shared_ptr
可以绑定到任何enable_shared_from_this
对象之前。
因此,当X的构造函数正在运行时,还没有enable_shared_from_this可以使用的shared_ptr。
但是对于调用 make_shared 的情况,可以访问控制块来创建weak_ptr,因为它们是在与类相同的分配内存块中创建的。