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

C++自定义智能指针集成异常:shared_from_this()返回空指针

问题原因分析

1. 调用时机过早:对象未被shared_ptr完全接管

当你通过VE::make_shared创建VENode实例后,如果还没将返回的智能指针赋值给任何变量,或者make_shared内部还没完成与enable_shared_from_this的绑定逻辑,就立刻调用Initialize(),此时enable_shared_from_this内部持有的weak_ptr还未被初始化。shared_from_this()本质是通过这个weak_ptr生成shared_ptr,自然返回空指针。

标准库中这种情况会直接抛出bad_weak_ptr异常,但你的自定义xmem库可能做了返回空的兼容处理。

2. 自定义库的enable_shared_from_this实现不完整

enable_shared_from_this的核心是:当第一个shared_ptr指向对象时,智能指针的控制块(你的MemoryControlBlock)需要自动检测对象是否继承自enable_shared_from_this,并将自身的weak_ptr绑定到enable_shared_from_this的内部成员。如果你的xmem库中这部分逻辑缺失——比如MemoryControlBlock没有处理enable_shared_from_this的绑定,那么即使对象被shared_ptr持有,shared_from_this()也无法获取有效指针。


enable_shared_from_this与shared_from_this() 使用指南

核心规则

  • 必须确保对象已经被至少一个shared_ptr持有后,才能调用shared_from_this(),绝对不能在构造函数、构造后立即(未赋值给shared_ptr变量时)调用。
  • 类必须公开继承enable_shared_from_this<T>(T是当前类类型),否则无法使用shared_from_this()。
  • 禁止手动创建enable_shared_from_this的实例,必须通过make_shared或shared_ptr构造函数创建对象,让智能指针自动完成绑定。

正确示例(标准库实现)

#include <memory>

class MyNode : public std::enable_shared_from_this<MyNode> {
public:
    void Initialize() {
        // 此时对象已经被shared_ptr持有,调用有效
        std::shared_ptr<MyNode> self = shared_from_this();
        // 后续使用self做操作
    }
};

int main() {
    // 正确做法:先将make_shared的结果赋值给shared_ptr变量
    std::shared_ptr<MyNode> node = std::make_shared<MyNode>();
    node->Initialize(); // 此时调用shared_from_this()有效
    return 0;
}

自定义库适配要点(针对你的xmem库)

  • 确保MemoryControlBlock在创建时,检查对象是否继承自自定义的enable_shared_from_this,并将控制块的weak_ptr赋值给enable_shared_from_this的内部成员。
  • 确保VE::make_shared的实现逻辑是:先创建对象,再绑定控制块与enable_shared_from_this,最后返回shared_ptr——避免在绑定完成前暴露对象给外部调用。

错误示例(禁止这么做)

// 错误:make_shared后立即调用,未赋值给shared_ptr变量
VE::make_shared<VENode>()->Initialize(); // 此时shared_from_this()返回空

// 错误:在构造函数中调用
class BadNode : public enable_shared_from_this<BadNode> {
public:
    BadNode() {
        shared_from_this(); // 此时对象还未被shared_ptr持有,必然失败
    }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:37:17