如何修复C ++中的"堆已损坏"错误?

How to fix 'Heap has been corrupted 'error in c++?

本文关键字:已损坏 错误 中的 何修复      更新时间:2023-10-16

当我运行程序时,在函数完成后出现异常"堆已损坏">

我已经读到,如果您正在使用已释放的内存,或者当您写入数组索引外的索引时,可能会导致此异常。但这些情况都不适用于这里。我已经阅读了一些问题的其他答案,但没有多大帮助。

`char fileNametoExport[26]="d:\FOlder1\part1.ipt";
 char WorkingFolderName[260] ="d:\folder";
 int start = rFind(fileNametoExport, '');
 int finish = rFind(fileNametoExport, '.');
 if (start == -1)
 start = 0;
char partname[260];
strcpy(partname,substr(fileNametoExport, start, finish));
::AfxMessageBox((LPCTSTR)partname);
char xtfile[260];
char xmltxtfile[260];
strcpy(xtfile, strcat(WorkingFolderName, partname));
strcat(xtfile, "__Default.x_t");
strcpy(xmltxtfile, WorkingFolderName);
strcat(xmltxtfile,"_XT_SE_INV_Default_SOLID_0_Solid1_xt.xmt_txt");`

函数 rfind(( 查找字符数组中字符的出现-

int rFind(char* s, char c)
    {
    int sz = 0;
    char *tmp = s;
    while (*tmp != '')
    {
        sz++;
        tmp++;
    }
    for (int i = sz - 1; i >= 0; i--)
    {
        if (*(s + i) == c)
            return i;
    }
    return -1;
}

函数 substr(( 获取从位置 x 到 y 的子字符串(Y 排除(

char* substr(char* s, const int b, const int f)
{
    char *str = new char[f - b];
    int t = 0;
    for (int i = b; i != f; i++)
    {
        str[t] = s[i];
        t++;
    }
    str[t] = '';
    return str;
}

附言-在提供输入时,我确保文件名导出始终包含"."和"\"。

  1. 程序不检查输入字符串的长度。您可以接收比缓冲区更长的字符串,程序将失败。
  2. 如果您的程序fileNametoExport = "d:\somefolder\somefilewithoutdot"finish将为 -1,程序在 strcpy(partname,substr(fileNametoExport, start, finish)); 时失败。
  3. 程序在缓冲区后写入 char* substr(char* s, const int b, const int f)

    str[t] = '';
    

    因为此时t等于f-bstr缓冲区的大小。

<crtdbg.h>的功能_ASSERTE( _CrtCheckMemory( ) );在搜索此类错误时非常有用。把它放在可疑代码周围,它会在你的错误之后失败。它仅适用于调试。