从源码角度解读 enable_shared_from_this

从源码角度解读 enable_shared_from_this

💡 原文中文,约3800字,阅读约需10分钟。
📝

内容提要

本文讨论了 C++ 中 std::enable_shared_from_this 的使用及其三个主要陷阱:1. 不能在构造函数中调用 shared_from_this(),否则会抛出异常;2. 对象必须由 shared_ptr 管理;3. 必须 public 继承 std::enable_shared_from_this。文章通过源码分析解释了这些限制的原因。

🎯

关键要点

  • 在 C++ 中,使用 std::enable_shared_from_this 时有三个主要陷阱。

  • 陷阱一:不能在构造函数中调用 shared_from_this(),否则会抛出 std::bad_weak_ptr 异常。

  • 陷阱二:对象必须由 shared_ptr 管理,shared_from_this() 才能生效,否则也会抛出 std::bad_weak_ptr 异常。

  • 陷阱三:必须 public 继承 std::enable_shared_from_this,不能是 protected 或 private 继承,否则会抛出 std::bad_weak_ptr 异常。

  • 这些限制的原因在于 __weak_this_ 属性的设置时机和条件,只有在创建 shared_ptr 对象时才能正确设置。

延伸问答

在 C++ 中,std::enable_shared_from_this 的主要用途是什么?

std::enable_shared_from_this 允许类内部获取自身的 shared_ptr,以便在需要时安全地共享对象。

使用 std::enable_shared_from_this 时有哪些主要陷阱?

主要陷阱包括:1. 不能在构造函数中调用 shared_from_this();2. 对象必须由 shared_ptr 管理;3. 必须 public 继承 std::enable_shared_from_this。

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

因为在构造函数执行时,__weak_this_ 属性尚未设置,调用会导致 std::bad_weak_ptr 异常。

对象必须由什么管理才能使用 shared_from_this()?

对象必须由 shared_ptr 管理,否则会抛出 std::bad_weak_ptr 异常。

如何正确继承 std::enable_shared_from_this?

必须 public 继承 std::enable_shared_from_this,不能使用 protected 或 private 继承。

std::enable_shared_from_this 的核心机制是什么?

其核心机制是一个 weak_ptr 属性 __weak_this_,shared_from_this() 将其转换为 shared_ptr。

➡️

继续阅读