从源码角度解读 enable_shared_from_this

从源码角度解读 enable_shared_from_this

💡 原文中文,约3200字,阅读约需8分钟。
📝

内容提要

使用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时需注意三个陷阱。
  • 陷阱1:不可在构造函数中调用shared_from_this(),否则会抛出std::bad_weak_ptr异常。
  • 陷阱2:对象必须由shared_ptr管理,shared_from_this()才能生效,否则会报std::bad_weak_ptr异常。
  • 陷阱3:必须public继承std::enable_shared_from_this,不能是protected或private继承,否则也会报std::bad_weak_ptr异常。
  • 这些限制有助于避免错误。
  • enable_shared_from_this的核心是一个weak_ptr属性__weak_this_。
  • shared_from_this实际上是将weak_ptr转换成shared_ptr。
  • __weak_this_是在创建shared_ptr对象时设置的。
  • shared_ptr可以直接访问并设置enable_shared_from_this的__weak_this_属性。
  • 只有当类public继承了enable_shared_from_this时,__weak_this_才会被设置。

延伸问答

使用std::enable_shared_from_this时需要注意哪些陷阱?

需要注意三个陷阱:1. 不可在构造函数中调用shared_from_this();2. 对象必须由shared_ptr管理;3. 必须public继承std::enable_shared_from_this。

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

因为在构造函数中调用会导致抛出std::bad_weak_ptr异常。

如何确保对象可以使用shared_from_this()?

对象必须由shared_ptr管理,并且类必须public继承std::enable_shared_from_this。

enable_shared_from_this的核心机制是什么?

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

如何在shared_ptr创建时设置__weak_this_属性?

在创建shared_ptr对象时,通过__enable_weak_this函数设置__weak_this_属性。

如果类未public继承enable_shared_from_this会发生什么?

会导致调用shared_from_this()时抛出std::bad_weak_ptr异常。

➡️

继续阅读