从技术角度来看,为什么shared_from_this不能在构造函数中使用?

问题描述 投票:0回答:2

C++标准库第91页我读过关于

shared_from_this()
的内容:

问题在于

shared_ptr
将自身存储在
Person
的基类,
enable_shared_from_this<>
在末尾 人的构建。

书中的相关代码片段是:

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

我不明白这里的两件事:

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

我明白还有

weak_ptr
还没有初始化。

编辑: 感谢安吉!仅在创建第一个

shared_from_this
shared_ptr
后,
Person
才会起作用。这个
shared_ptr
将检查
Person
类是否继承自
enable_shared_from_this
,如果是则初始化其内部
weak_ptr

c++ constructor shared-ptr
2个回答
73
投票

原因很简单:在对象

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
对象之前。


0
投票

因此,当X的构造函数正在运行时,还没有enable_shared_from_this可以使用的shared_ptr。

但是对于调用 make_shared 的情况,可以访问控制块来创建weak_ptr,因为它们是在与类相同的分配内存块中创建的。

© www.soinside.com 2019 - 2024. All rights reserved.