You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用share_from_this替代this指针生成shared_ptr初始化Channel类?

用std::shared_ptr初始化Channel类的正确实现

你已经通过让Soundfile继承std::enable_shared_from_this<Soundfile>并实现getptr()方法,铺好了用shared_ptr替代原始this指针的基础。接下来在openRead方法里初始化Channel的操作很直接,但有几个关键细节要注意:

核心实现代码

在openRead方法中,直接调用你的getptr()(或者直接用shared_from_this())拿到当前对象的shared_ptr,再传给Channel的构造函数即可:

bool Soundfile::openRead(const char *filename_) {
    // 先完成文件打开、参数初始化等前置逻辑
    // ... 你的其他代码 ...

    // 获取指向当前Soundfile对象的shared_ptr
    auto self_shared_ptr = getptr(); 
    // 或者直接写:auto self_shared_ptr = shared_from_this(); 效果完全一致

    // 用shared_ptr初始化Channel(根据你的实际场景调整,比如是成员变量还是局部变量)
    // 如果是局部变量:
    std::shared_ptr<Channel> channel_instance = std::make_shared<Channel>(self_shared_ptr);
    // 如果是Soundfile的成员变量:
    // m_channel = std::make_shared<Channel>(self_shared_ptr);

    // ... 后续业务逻辑 ...
    return true;
}

必须注意的关键细节

  • 绝对不能直接用std::shared_ptr<Soundfile>(this):这种方式会创建一个全新的shared_ptr控制块,和原本持有该Soundfile对象的shared_ptr完全独立,最终会导致对象被重复析构,触发未定义行为。而shared_from_this()会复用已有的控制块,保证引用计数正确。
  • 确保调用shared_from_this()前对象已被shared_ptr持有:你必须通过std::make_shared<Soundfile>()或者std::shared_ptr<Soundfile>(new Soundfile)来创建Soundfile对象,不能在栈上声明Soundfile实例(比如Soundfile sf;),否则调用shared_from_this()会触发未定义行为(C++17之前可能抛出std::bad_weak_ptr异常,之后直接UB)。
  • 不要在构造函数里调用shared_from_this():对象构造完成前,shared_ptr的控制块还未建立,此时调用会直接出错。

可选优化

如果你的getptr()方法只是简单封装了shared_from_this(),其实可以直接在openRead里调用shared_from_this(),省去一层封装——当然保留getptr()也没问题,看团队的代码风格偏好。

内容的提问来源于stack exchange,提问作者Luis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:16:30