C++动态数组程序触发HEAP CORRUPTION DETECTED错误如何解决?
问题原因
你遇到的堆破坏错误是数组越界写入导致的,错误出现在分类写入9个动态数组的for循环里,从80~84分段开始,所有目标指针都错误复用了testScores7579:
// 80-84分段,错误写入testScores7579数组 if (randomTestScores[i] >= 80 && randomTestScores[i] <= 84) {*(testScores7579 + l8084) = randomTestScores[i]; l8084++;} // 85-89分段,错误写入testScores7579数组 if (randomTestScores[i] >= 85 && randomTestScores[i] <= 89) {*(testScores7579 + l8589) = randomTestScores[i]; l8589++;} // 90-94分段,错误写入testScores7579数组 if (randomTestScores[i] >= 90 && randomTestScores[i] <= 94) {*(testScores7579 + l9094) = randomTestScores[i]; l9094++;} // 95-99分段,错误写入testScores7579数组 if (randomTestScores[i] >= 95 && randomTestScores[i] <= 99) {*(testScores7579 + l9599) = randomTestScores[i]; l9599++;}
testScores7579数组的大小只有你之前统计的s7579,你把其他分段的数值都写入这个数组,远远超过了它的申请长度,直接破坏了堆空间结构,所以会触发堆破坏检测报错。
修复方案
把这四行的目标指针替换为对应分段的数组指针即可:
// 80-84分段修改为写入testScores8084 if (randomTestScores[i] >= 80 && randomTestScores[i] <= 84) {*(testScores8084 + l8084) = randomTestScores[i]; l8084++;} // 85-89分段修改为写入testScores8589 if (randomTestScores[i] >= 85 && randomTestScores[i] <= 89) {*(testScores8589 + l8589) = randomTestScores[i]; l8589++;} // 90-94分段修改为写入testScores9094 if (randomTestScores[i] >= 90 && randomTestScores[i] <= 94) {*(testScores9094 + l9094) = randomTestScores[i]; l9094++;} // 95-99分段修改为写入testScores9599 if (randomTestScores[i] >= 95 && randomTestScores[i] <= 99) {*(testScores9599 + l9599) = randomTestScores[i]; l9599++;}
其他优化建议
- 全局变量可以尽量放到main函数内部定义,避免全局空间污染
- 统计分段和写入分段可以合并成一个循环,不用两次遍历全部199个元素,提高效率
- 如果使用C++11及以上版本,可以用
std::vector代替手动管理的动态数组,自动处理内存申请释放,避免内存泄漏和越界问题
内容的提问来源于stack exchange,提问作者spraka
相关产品推荐
相关产品推荐

