0

0

enable_shared_from_this何时使用 获取this的shared_ptr方法

P粉602998670

P粉602998670

发布时间:2025-08-13 11:23:01

|

360人浏览过

|

来源于php中文网

原创

当需要在类内部安全获取指向当前对象的std::shared_ptr时应使用std::enable_shared_from_this,因为直接使用std::shared_ptr(this)会创建独立的引用计数导致双重释放;正确做法是让类继承std::enable_shared_from_this并通过std::make_shared创建对象后调用shared_from_this(),从而确保所有返回的shared_ptr共享同一控制块,适用于回调、自引用等场景,且不可在构造函数中或未被shared_ptr管理时调用,否则会抛出异常或导致未定义行为。

enable_shared_from_this何时使用 获取this的shared_ptr方法

当你需要在类的内部安全地获取指向当前对象的

std::shared_ptr
时,就应该使用
enable_shared_from_this

直接使用

std::make_shared(this)
或者
std::shared_ptr(this)
是错误且危险的,因为这会创建一个新的引用计数,导致多个独立的
shared_ptr
管理同一个对象,最终可能引发双重释放或未定义行为。

什么时候使用 enable_shared_from_this?

enable_shared_from_this
的核心用途是:在对象已经被
shared_ptr
管理的前提下,类内部需要生成指向自身的
shared_ptr

常见场景包括:

BlessAI
BlessAI

Bless AI 提供五个独特的功能:每日问候、庆祝问候、祝福、祷告和名言的文本生成和图片生成。

下载
  • 回调机制中传递当前对象的共享指针(如异步操作、事件处理)
  • 需要在成员函数中将
    this
    作为
    shared_ptr
    传给其他函数或对象
  • 实现“自引用”逻辑,比如对象需要把自己加入某个共享容器

正确使用方式

要使用

enable_shared_from_this
,类必须:

  1. 继承
    std::enable_shared_from_this
  2. 对象必须通过
    std::shared_ptr
    创建
  3. 使用
    shared_from_this()
    获取
    shared_ptr
#include 
#include 

struct MyClass : std::enable_shared_from_this {
    void do_something() {
        // 安全地获取指向自身的 shared_ptr
        auto self = shared_from_this();
        some_other_function(self);
    }

    void some_other_function(std::shared_ptr ptr) {
        std::cout << "Called with shared_ptr\n";
    }
};

int main() {
    auto obj = std::make_shared();  // 必须用 shared_ptr 创建
    obj->do_something();  // 此时 shared_from_this() 才能安全调用
}

常见错误和注意事项

  • ❌ 不要直接
    new
    对象然后调用
    shared_from_this()
    ,会抛出
    std::bad_weak_ptr
    异常
  • ❌ 不要在构造函数中调用
    shared_from_this()
    ,此时对象尚未被
    shared_ptr
    完全接管
  • ✅ 确保对象生命周期由
    shared_ptr
    管理
  • ✅ 多次调用
    shared_from_this()
    返回的
    shared_ptr
    共享同一引用计数

为什么不能直接 new 出来再用 shared_ptr 包装?

MyClass* p = new MyClass;
std::shared_ptr ptr1(p);
std::shared_ptr ptr2(p); // 危险!两个独立的 shared_ptr 管理同一对象

这样会造成两个独立的控制块,引用计数互不相干,析构时会崩溃。

enable_shared_from_this
内部使用
weak_ptr
跟踪对象是否已被
shared_ptr
管理,确保所有
shared_from_this()
返回的指针共享同一个控制块。

基本上就这些。只要记住:想在类内部返回

this
shared_ptr
,且对象是用
shared_ptr
管理的,就必须用
enable_shared_from_this

相关专题

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

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

37

2026.01.14

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

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

19

2026.01.13

PHP 高性能
PHP 高性能

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

37

2026.01.13

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

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

19

2026.01.13

PHP 文件上传
PHP 文件上传

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

16

2026.01.13

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

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

6

2026.01.13

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

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

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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