必须继承 std::enable_shared_from_this 且用 std::make_shared 构造,否则 shared_from_this() 抛 std::bad_weak_ptr;需公有继承并匹配模板参数,构造函数内不可调用,推荐 weak_from_this() 防异常。

必须继承 std::enable_shared_from_this,否则调用 shared_from_this() 会抛出 std::bad_weak_ptr 异常。
为什么直接 new + shared_ptr 构造后不能用 shared_from_this()
因为 std::shared_from_this() 依赖内部的 std::weak_ptr 成员(由 std::enable_shared_from_this 提供),这个弱指针只在对象被 std::make_shared 构造时自动绑定。手动用 new 配合 std::shared_ptr 构造器,不会触发该绑定逻辑。
- 错误写法:
auto p = std::shared_ptr
(new MyClass()); p->shared_from_this(); // 抛出 std::bad_weak_ptr - 正确写法:
auto p = std::make_shared
(); p->shared_from_this(); // OK - 根本原因:只有
std::make_shared能在分配内存时一并初始化enable_shared_from_this内部的weak_ptr
继承 enable_shared_from_this 的写法细节
必须是公开继承,且模板参数必须与当前类一致;否则编译失败或行为未定义。
- 正确:
class MyClass : public std::enable_shared_from_this
{ ... }; - 错误(私有继承):
class MyClass : private std::enable_shared_from_this - 错误(类型不匹配):
class MyClass : public std::enable_shared_from_this - 注意:该基类无构造/析构开销,也不影响对象内存布局(空基优化生效)
shared_from_this() 和 weak_from_this() 的使用边界
shared_from_this() 要求对象**必须已由 shared_ptr 管理**,否则异常;weak_from_this()(C++17 起)更安全,即使尚未被管理也返回空 std::weak_ptr。
立即学习“C++免费学习笔记(深入)”;
- 典型误用场景:在构造函数里调用
shared_from_this()—— 此时对象还没被任何shared_ptr持有,必崩 - 安全做法:把需要 self 指针的逻辑延迟到
init()或回调中,确保对象已在shared_ptr生命周期内 - 若需避免异常,改用:
auto wp = weak_from_this(); if (auto sp = wp.lock()) { /* 安全使用 sp */ }
最容易被忽略的是构造时机和继承语法的一致性——少一个 public 或错一个模板参数,编译可能通过但运行时崩溃;而一旦忘了用 make_shared,问题会延迟到首次调用 shared_from_this() 才暴露。











