0

0

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

尼克

尼克

发布时间:2026-01-15 12:58:03

|

167人浏览过

|

来源于php中文网

原创

必须继承 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

先见AI
先见AI

数据为基,先见未见

下载

立即学习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() 才暴露。

相关专题

更多
class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

464

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

12

2025.12.06

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

61

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

31

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

73

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

20

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

7

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

4

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.7万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号