2010-09-21 64 views
0

我有realloc函數的問題:* glibc的檢測* realloc的():無效的下一個大小:

*** glibc detected *** realloc(): invalid next size:

這裏是代碼的相關部分:

char* pathfile = NULL; 
    int tcpargc=6; 
    char *tcpargv[tcpargc]; 
    int it; 
    for (it = 0;it < tcpargc;it++) 
     tcpargv[it] = NULL; 
    ... 
    while (1) { 
    ... 
    if (pathfile == NULL) 
     pathfile=(char*)malloc((strlen(RAMDIR)+strlen(tempfilename)+7)*sizeof(char)); 
    else { 
    if ((tmp=(char*)realloc(pathfile,(strlen(RAMDIR)+strlen(tempfilename)+7)*sizeof(char))) == NULL) 
    { 
printf("ERROR: realloc failed"); 
     free(pathfile); 
    } 
    else 
     pathfile = tmp; 
    } 
    ... 
    if (tcpargv[4] == NULL) 
    tcpargv[4]=(char*)malloc((strlen("--infile=")+strlen(pathfile)+1)*sizeof(char)); 
    else { 
    if ((tmp = (char*)realloc(tcpargv[4],strlen("--infile=")+strlen(pathfile)+1)*sizeof(char))) == NULL){ 
    printf("ERROR: realloc failed"); 
    free(tcpargv[4]); 
    } 
    else 
    tcpargv[4] = tmp; 
    } 
    ...  
    } 

我都檢查一遍並再次,但我找不到錯誤。
謝謝你的幫助。

+0

如果沒有更多信息,我們不太可能找到它。你能用調試器找出它崩潰的地方嗎?一個註釋:在C中,'sizeof(char)'的定義是1。你可以放棄它。在你釋放它之後, – 2010-09-21 17:36:19

+0

將釋放的ptr設置爲NULL:'free(pathfile); pathfile = NULL;'。我注意到你測試的指針在循環中爲NULL;釋放它**不會讓它空**。 – pmg 2010-09-21 17:38:38

+3

您可能會發現它有助於在Valgrind http://valgrind.org下運行您的程序。它能夠自動識別代碼中的內存分配錯誤。 – 2010-09-21 17:42:15

回答

1

該錯誤表明您的代碼可能會覆蓋由glibc內存分配子系統使用的簿記數據。正如Michael Mior在他的評論中所建議的那樣,請嘗試在Valgrind下運行您的代碼 - 它非常擅長查找內存損壞錯誤。

+0

Valgrind是一個非常好的提示。然而,我現在有一個新的問題,當我使用valgrind我的程序工作正常,除非我得到雙免費或腐敗(出)。 – Yassine 2010-09-23 11:11:04

+0

@Yassine這是一個怎樣的問題? - 也許我不明白你的意思。 Valgrind通過仿真層運行你的程序,該層攔截並報告無效的內存訪問。而不是glibc錯誤或隨機段錯誤,您會得到valgrind錯誤日誌,顯示需要修復代碼的位置。修復你的內存錯誤,代碼將在valgrind下運行,而不是。 – llasram 2010-09-23 12:03:06

+0

問題是,當我使用valgrind時,我的程序運行良好,我看到valgrind報告,但程序仍在工作,正是我想要的。但是當我啓動沒有valgrind報告的程序時,它在循環出現錯誤時指示雙重釋放或損壞(出)後不起作用。 – Yassine 2010-09-23 12:10:07

相關問題