c++中如何使用std::shared_from_this_c++类内部获取共享指针【详解】

11次阅读

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

c++中如何使用std::shared_from_this_c++类内部获取共享指针【详解】

必须继承 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() 才暴露。

text=ZqhQzanResources