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

C++抛std::logic_error: basic_string::_M_construct null not valid排查

问题根源

报错是访问已销毁的栈对象的成员变量导致的,直接触发点在BST类的add方法中:

void add(int inHealth, int inSpeed,int inDamage, string inName){
    Node* n = new Node();
    Monster holder = Monster(inHealth, inSpeed, inDamage, inName); // holder是当前函数栈上的局部变量
    n->mob = &holder; // 存储了局部变量的内存地址
    // 其余逻辑省略
} // 函数执行结束后,holder对象被销毁,n->mob变为野指针

你后续访问dungeon.root->mob->name时,实际访问的是已经被系统回收的栈内存,内存内容不可预测,刚好触发了std::string的空指针构造校验,就抛出了你看到的std::logic_error。

修复方案

将Monster对象创建在堆上即可,修改add方法的对应逻辑:

void add(int inHealth, int inSpeed,int inDamage, string inName){
    Node* n = new Node();
    n->mob = new Monster(inHealth, inSpeed, inDamage, inName); // 堆上创建对象,生命周期自行控制
    // 其余逻辑保持不变
}

其他需要修复的代码隐患

  • 判断语句错误使用赋值运算符=而非相等判断运算符==,会导致逻辑永远走第一个分支:
    // 错误写法
    if(weapon = 1)
    else if(weapon = 2)
    // 正确写法
    if(weapon == 1)
    else if(weapon == 2)
    
  • Attack函数声明返回值类型为int,但实际没有return语句,会触发未定义行为,建议修改返回值类型为void或者补充返回逻辑。
  • 后续可以补充堆内存的释放逻辑,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:45:01