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
相关产品推荐
相关产品推荐

