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

C++执行delete[]释放堆内存时抛出异常问题求助

问题排查及修复方案

核心错误原因

你代码中的delete[]异常是重复释放同一块堆内存导致的,具体问题如下:

  • 内存分配和释放次数不匹配:char* user = new char[MAX_USER] 和 char* key = new char[MAX_PASS] 仅各执行了1次,总共只分配了2块堆内存。但在退出分支的嵌套循环中,你对user执行了 player.size() * M_USER 次delete[],对key执行了player.size() * M_PASS次delete[]。第一次释放完成后,user和key就变成了野指针,后续再对野指针执行释放操作直接触发异常。
  • 潜在字符串越界风险:你给user、key赋值时没有在末尾添加C风格字符串要求的结束符\0,如果后续代码把这两个指针当字符串处理,会发生数组越界访问,也可能触发内存错误。
  • 无用代码隐患:定义的Userboard* stPlayer[NO_OF_PLAYERS]数组从未初始化和使用,如果后续补充逻辑给该数组成员分配堆内存,现有代码没有对应释放逻辑,会产生内存泄漏。

修复方案

修改退出分支的内存释放逻辑,保证new和delete[]一一对应即可,同时可以补充字符串结束符避免潜在问题:

case 1:
    // 各new一次就各delete[]一次,不需要套任何循环
    delete[] user;
    delete[] key;
    // 如果后续给stPlayer分配了内存,在这里补充对应释放逻辑
    return 0;

如果需要将user、key作为正常C字符串使用,在赋值循环后补充结束符:

for (int a = 0; a < M_USER;a++) {
    user[a] = u[a];
}
user[M_USER] = '\0'; // 补充结束符,注意分配的MAX_USER长度要大于等于M_USER+1

for (int a = 0; a < M_PASS; a++) {
    key[a] = p[a];
}
key[M_PASS] = '\0'; // 补充结束符,注意分配的MAX_PASS长度要大于等于M_PASS+1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:06:04