从源码角度解读 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时的三个陷阱,主要是为了确保对象的生命周期管理。构造函数中调用shared_from_this会导致异常,因为此时对象尚未被shared_ptr管理,无法安全地获取shared_ptr。理解这些限制有助于避免潜在的内存管理错误。

public继承的重要性

必须public继承std::enable_shared_from_this是为了确保__weak_this_属性能够正确设置。若使用protected或private继承,shared_ptr无法访问该属性,导致shared_from_this调用失败。这一设计确保了类的使用者能够安全地获取自身的shared_ptr。

weak_ptr与shared_ptr的关系

enable_shared_from_this的核心在于weak_ptr的使用。通过将weak_ptr转换为shared_ptr,能够安全地管理对象的生命周期。理解这一机制有助于开发者在设计类时合理使用智能指针,避免内存泄漏或悬挂指针的问题。

延伸问答

使用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异常。

🏷️

标签

➡️

继续阅读