簡體   English   中英

如何修復C ++中的“堆已損壞”錯誤?

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

當我運行該程序時,在完成該功能后會出現異常“堆已損壞”

我已經讀到,如果您使用的是已釋放的內存,或者正在寫入數組索引之外的索引,則可能導致此異常。 但是,這里沒有任何一種情況適用。 我已經閱讀了一些問題的其他答案,但並沒有太大幫助。

`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;
}

PS-在輸入時,我確保fileNametoExport始終包含“。”。 和'\\'。

  1. 您的程序不檢查輸入字符串的長度。 您收到的字符串長於緩沖區,程序將失敗。
  2. 如果您的程序獲得fileNametoExport = "d:\\\\somefolder\\\\somefilewithoutdot" ,則finish將為-1,並且程序在strcpy(partname,substr(fileNametoExport, start, finish));處失敗strcpy(partname,substr(fileNametoExport, start, finish));
  3. 程序在char* substr(char* s, const int b, const int f)中的緩沖區之后寫入

     str[t] = '\\0'; 

    因為此時t等於fb ,所以str緩沖區的大小。

函數_ASSERTE( _CrtCheckMemory( ) ); 搜索此類錯誤時,來自<crtdbg.h>非常有用。 將其放在可疑代碼周圍,並在發生錯誤后失敗。 它僅在調試中有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM