如何使用share_from_this替代this指针生成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
相关产品推荐
相关产品推荐

