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

时间:2019-07-23 05:42:59

标签: c++ arrays heap-memory heap-corruption

运行程序时,功能完成后出现异常“堆已损坏”

我已阅读到,如果您使用的是已释放的内存,或者正在写入数组索引之外的索引,则可能导致此异常。但是,这里没有任何一种情况适用。我已经阅读了一些问题的其他答案,但并没有太大帮助。

`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()在char数组中查找char的出现-

int rFind(char* s, char c)
    {
    int sz = 0;
    char *tmp = s;
    while (*tmp != '\0')
    {
        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] = '\0';
    return str;
}

P.S-在输入时,请确保fileNametoExport始终包含“。”。和'\'。

1 个答案:

答案 0 :(得分:2)

  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] = '\0';
    

    因为此时t等于f-b缓冲区的大小str

_ASSERTE( _CrtCheckMemory( ) );中的函数<crtdbg.h>在搜索此类错误时非常有用。将其放在可疑代码周围,并在发生错误后失败。它只能在调试中使用。