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

使用shared_ptr时出现Heap use after free问题求助

Heap Use After Free 排查与解决(针对std::shared_ptr传递场景)

核心问题定位

Heap use after free 说明executeImpl执行时,map内std::shared_ptr<ASTNode>指向的内存已被释放,而构造阶段正常,本质是该shared_ptr的引用计数在构造后到executeImpl执行前被错误清零。以下是具体排查方向和修复建议:

1. 检查ExpressionTree::getRoot()的实现

如果getRoot()错误地转移了root的所有权而非返回拷贝,会导致后续持有该指针的对象引用计数仅为1,一旦该对象释放,内存直接回收。

  • 错误实现示例:
    std::shared_ptr<ASTNode> ExpressionTree::getRoot() {
        return std::move(root); // 转移所有权后,root变为空指针,后续调用getRoot()会返回无效指针
    }
    
  • 正确实现(返回拷贝,递增引用计数):
    std::shared_ptr<ASTNode> ExpressionTree::getRoot() const {
        return root; // 拷贝操作让引用计数+1,确保内存不会被意外释放
    }
    

2. 排查When构造函数的map插入逻辑

如果插入map时错误使用std::move且后续vector被销毁,或map的key比较逻辑异常,可能导致指针引用计数异常:

  • 确保插入时保留引用计数:
    // 直接拷贝插入,保证vector和map同时持有指针,引用计数正确
    for (const auto& ptr : conditionVec) {
        ruleMap[ptr] = correspondingRules;
    }
    
  • 若使用std::move,需确保vector不再被后续代码访问:
    for (auto&& ptr : std::move(conditionVec)) {
        ruleMap[std::move(ptr)] = correspondingRules;
    }
    
  • 确认ASTNode或其子类正确实现了operator<(std::map依赖key的比较逻辑,错误的比较可能导致重复key或指针被意外覆盖)。

3. 检查ASTNode的析构与引用计数干扰

  • 禁止在任何地方手动调用delete ptr.get(),这会绕过shared_ptr的引用计数机制,直接释放内存。
  • 检查ASTNode子类的自定义析构函数,确保没有裸指针资源管理逻辑破坏shared_ptr的生命周期。

4. 验证When对象的生命周期

如果executeImpl是异步调用,需确保When对象的生命周期覆盖executeImpl的执行周期,避免When对象已被销毁后,map成员内存被回收。

快速验证手段

  1. 在ASTNode的析构函数中添加日志,追踪节点销毁地址:
    ~ASTNode() override {
        std::cout << "ASTNode destroyed: " << this << std::endl;
    }
    
  2. 在关键节点打印shared_ptr的引用计数,追踪变化:
    // getRoot()中
    auto ptr = root;
    std::cout << "getRoot() use_count: " << ptr.use_count() << std::endl;
    return ptr;
    
    // When构造函数插入时
    std::cout << "Insert into map, use_count: " << ptr.use_count() << std::endl;
    
    // executeImpl访问时
    auto& node = conditionExpression_rule_pair->first;
    std::cout << "executeImpl use_count: " << node.use_count() << std::endl;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:20:27