贝利信息

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

日期:2026-01-15 00:00 / 作者:尼克
必须继承 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_fr

om_this()

因为 std::shared_from_this() 依赖内部的 std::weak_ptr 成员(由 std::enable_shared_from_this 提供),这个弱指针只在对象被 std::make_shared 构造时自动绑定。手动用 new 配合 std::shared_ptr 构造器,不会触发该绑定逻辑。

继承 enable_shared_from_this 的写法细节

必须是公开继承,且模板参数必须与当前类一致;否则编译失败或行为未定义。

shared_from_this() 和 weak_from_this() 的使用边界

shared_from_this() 要求对象**必须已由 shared_ptr 管理**,否则异常;weak_from_this()(C++17 起)更安全,即使尚未被管理也返回空 std::weak_ptr

最容易被忽略的是构造时机和继承语法的一致性——少一个 public 或错一个模板参数,编译可能通过但运行时崩溃;而一旦忘了用 make_shared,问题会延迟到首次调用 shared_from_this() 才暴露。