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()也无法获取有效指针。
核心规则
- 必须确保对象已经被至少一个
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
相关产品推荐
相关产品推荐

