在the book The C++ Standard Library页面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
尚未初始化。
编辑:
感谢Angew! shared_from_this
仅在创建第一个shared_ptr
到Person
后才有效。此shared_ptr
会检查Person
类是否继承自enable_shared_from_this
,如果是,则初始化其内部weak_ptr
。
答案 0 :(得分:32)
原因很简单:在对象X
中,enable_shared_from_this
通过使用指向对象{{1}的第一个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
对象之前运行。