2011-02-08 55 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++;