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

释放内存时触发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的循环会跳过中间的字符(这部分不直接导致堆损坏,但逻辑上不够完善)。

修复步骤

  1. 分配内存时多留一个字节给'\0'
    修改内存分配代码,预留存储终止符的空间:

    char* sentence = new char[size + 1]; // +1 用于存放'\0'
    
  2. 限制输入长度,避免越界写入
    使用setw限制cin的输入长度,防止用户输入超过size的字符串(需要包含<iomanip>头文件):

    cin >> setw(size + 1) >> sentence;
    

    也可以用getline(注意要先跳过输入size后的换行符):

    cin.ignore();
    cin.getline(sentence, size + 1);
    
  3. 修正display函数的循环条件(可选,更严谨)
    不再依赖'\0',直接用传入的size作为循环上限:

    void display(char* arr, int size) {
        for (int i = 0; i < size; i++) {
            cout << arr[i] << " ";
        }
    }
    
  4. 优化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,提问作者سید نعمان

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:47:20