c++ 为什么shared_from_this不能在构造函数中使用?

zbwhf8kr  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(131)

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_ptrPerson被创建后才能工作。这个shared_ptr将检查Person类是否继承自enable_shared_from_this,如果是,则初始化其内部的weak_ptr

wlp8pajw

wlp8pajw1#

原因很简单:在对象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());

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

lymgl2op

lymgl2op2#

因此,当X的构造函数运行时,还没有enable_shared_from_this可以使用的shared_ptr。
但是当make_shared被调用时,可以访问一个控制块来创建一个weak_ptr before/while构造函数,因为它们是在与类相同的内存块中创建的。

相关问题