首页  >  文章  >  后端开发  >  为什么不能在构造函数中使用“shared_from_this()”?

为什么不能在构造函数中使用“shared_from_this()”?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-06 15:35:02459浏览

Why Can't You Use `shared_from_this()` in Constructors?

理解构造函数中shared_from_this的局限性

正如《C标准库》摘录中所述,shared_from_this()面临着一个技术问题构造函数内的限制。要理解这个概念,有必要深入研究shared_from_this()的内部工作原理。

弱指针在shared_from_this中的作用

shared_from_this()依赖于一个内部的weak_ptr 维护对创建的对象的弱引用。这个弱指针保持未初始化状态,直到为该对象创建强shared_ptr(拥有该对象的shared_ptr)。只有实例化第一个shared_ptr后,对象的基类enable_shared_from_this才能访问这个shared_ptr并初始化weak_ptr。

构造时序问题

这个依赖现有的shared_ptr给构造函数带来了问题。当调用构造函数时,尚不存在指向正在构造的对象的shared_ptr。因此,在构造过程中,enable_shared_from_this无法初始化其weak_ptr,从而导致shared_from_this()在构造函数中无法使用。

澄清示例

请考虑以下代码片段:

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

std::shared_ptr<Person> p(new Person());

在此示例中,Person() 的构造函数在shared_ptr p 的构造函数之前运行。这意味着在Person()构造函数期间,不存在指向Person对象的shared_ptr,从而禁止enable_shared_from_this初始化其weak_ptr并导致构造函数内无法访问shared_from_this()。

以上是为什么不能在构造函数中使用“shared_from_this()”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn