💡
原文中文,约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异常。
➡️