2011-02-08 54 views
10

在Valgrind調試我的程序時,儘管我認爲有效的調用是免費的,但我發現內存泄漏。首先,被分配內存和存儲它的代碼:C內存泄露儘管免費

row = malloc(sizeof(Row)); 
    row->columns = malloc(sizeof(char*) * headcnt); 
    row->numcol = 0; 

    ... 

    row->numcol = colcnt; 
    rows   = realloc(rows, (rowcnt+1) * sizeof(Row)); 
    rows[rowcnt++] = *row; 

負責試圖釋放內存的代碼:

void cleanUp(){ 
    int i = 0; 
    int j = 0; 

    for (i = 0; i < rowcnt; i++){ 
     for (j = 0; j < rows[i].numcols; j++){ 
      free(rows[i].columns[j]); 
     } 
     free(&rows[i]); 
    } 
    free(rows); 
    exit(0); 
} 

行的聲明:

typedef struct { 
    char** columns; 
    unsigned short int numcol; 
} Row; 

Row* rows = NULL; 

更糟仍然,這個程序有時會導致一個glibc錯誤,在free(&rows[i])抱怨雙免費。我對C是新手,並且會很感激任何人可能擁有的指針(ahem)。

+1

您需要包括行類型的聲明。 – unwind 2011-02-08 14:30:52

+0

你有沒有試過叮叮? – ustun 2011-02-08 14:39:26

+0

這裏可以使用更多的代碼。目前我有點困惑,爲什麼你爲一行中的每一列設置`malloc`空間,然後將row-> numcol設置爲零。 – GrahamS 2011-02-08 14:39:40

回答

8

rows[rowcnt++] = *row;有效地使你分配的內存的副本。你的數組行應該是一個指針數組。也就像Oli Chalesworth指出的那樣,對於所有專欄,您免費的專欄應該是免費的。

rows = malloc(count * sizeof(Row*)); // This is probably done somewhere 

row->columns = malloc(sizeof(char*) * headcnt); 
row->numcol = 0; 

... 

row->numcol = colcnt; 
rows   = realloc(rows, (rowcnt+1) * sizeof(Row*)); 
rows[rowcnt++] = row; 

現在,如果你清理

void cleanUp(){ 
    int i = 0; 
    int j = 0; 

    for (i = 0; i < rowcnt; i++){ 
     free(rows[i]->columns); 
    } 
    free(rows); 
    exit(0); 
} 
-6

也許我很密集,但這不是完全沒有必要嗎?無論如何,只要程序退出,所有的內存都會被釋放。

5

每個致電malloc(或realloc)的電話必須與相應的致電free的電話相匹配。如果你這樣動態分配數組:

int *p = malloc(sizeof(int) * NUM); 

你自由這樣的:

free(p); 

不喜歡這樣的:

for (int i = 0; i < NUM; i++) 
{ 
    free(p[i]); 
} 

看來你是不正確的事情了。我懷疑你的清理代碼應該是:

void cleanUp(){ 
    int i = 0; 
    int j = 0; 

    for (i = 0; i < rowcnt; i++){ 
     for (j = 0; j < rows[i].numcols; j++){ 
      free(rows[i].columns[j]); // Free whatever rows[i].columns[j] points to 
     } 
     free(rows[i].columns); // Matches row->columns = malloc(sizeof(char*) * headcnt); 
    } 
    free(rows); // Matches rows = realloc(rows, (rowcnt+1) * sizeof(Row)); 
    exit(0); 
} 

而且,也沒有辦法匹配row = malloc(sizeof(Row));。我懷疑您分配的代碼應該是:

row->numcol = colcnt; 
rows   = realloc(rows, (rowcnt+1) * sizeof(Row)); 
rows[rowcnt].columns = malloc(sizeof(char*) * headcnt); 
rows[rowcnt].numcol = 0; 
rowcnt++;