释放内存时触发Heap Corruption Detected错误,求原因与解决方法
Heap Corruption Detected错误原因及修复方案
什么是Heap Corruption Detected错误
Heap Corruption(堆损坏)指程序非法修改了堆内存中不属于自身的区域,破坏了内存管理系统的完整性。当调用delete[]释放堆内存时,系统会检查堆的完整性,一旦发现异常就会抛出这个错误。
你的代码存在的问题
字符串内存分配未预留终止符空间
C风格字符串必须以'\0'作为结束标志,但你分配内存时只申请了size个字符的空间:char* sentence = new char[size];当用户输入长度为
size的字符串时,cin会自动在末尾添加'\0',这会超出你分配的内存范围,直接破坏堆结构。display函数依赖'\0'的循环逻辑存在风险
如果用户输入的字符串长度刚好是size,加上'\0'的越界写入后,display函数读取时可能访问到非法内存,进一步加剧堆损坏。reverse函数循环逻辑不够严谨
当size为奇数时,i > size/2的循环会跳过中间的字符(这部分不直接导致堆损坏,但逻辑上不够完善)。
修复步骤
分配内存时多留一个字节给
'\0'
修改内存分配代码,预留存储终止符的空间:char* sentence = new char[size + 1]; // +1 用于存放'\0'限制输入长度,避免越界写入
使用setw限制cin的输入长度,防止用户输入超过size的字符串(需要包含<iomanip>头文件):cin >> setw(size + 1) >> sentence;也可以用
getline(注意要先跳过输入size后的换行符):cin.ignore(); cin.getline(sentence, size + 1);修正
display函数的循环条件(可选,更严谨)
不再依赖'\0',直接用传入的size作为循环上限:void display(char* arr, int size) { for (int i = 0; i < size; i++) { cout << arr[i] << " "; } }优化
reverse函数的循环逻辑(可选)
用双指针法让交换逻辑更直观,覆盖所有需要交换的位置:char *reverse(char *arr, int size) { int left = 0; int right = size - 1; while (left < right) { char temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } return arr; }
完整修复后的代码
#include <iostream> #include <iomanip> using namespace std; char *reverse(char *arr, int size) { int left = 0; int right = size - 1; while (left < right) { char temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } return arr; } void display(char* arr, int size) { for (int i = 0; i < size; i++) { cout << arr[i] << " "; } } int main() { int size; cout << "Enter the size of string." << endl; cin >> size; char* sentence = new char[size + 1]; cout << "Enter sentence: "; cin >> setw(size + 1) >> sentence; char *arr_ay = reverse(sentence, size); display(arr_ay, size); delete[] sentence; return 0; }
内容的提问来源于stack exchange,提问作者سید نعمان
相关产品推荐
相关产品推荐

