C内存泄漏,尽管免费

zch*_*odd 10 c memory valgrind pointers

在用Valgrind调试我的程序时,我发现了一个内存泄漏,尽管我认为是有效的免费调用.首先,分配内存并存储它的代码:

    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;
Run Code Online (Sandbox Code Playgroud)

负责尝试释放内存的代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

Row的声明:

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

Row* rows = NULL;
Run Code Online (Sandbox Code Playgroud)

更糟糕的是,这个程序有时会导致glibc错误,free(&rows[i])因为抱怨双重免费.我是C的新手,并且会感谢有人可能提出的任何指针(咳咳).

Rod*_*Rod 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;
Run Code Online (Sandbox Code Playgroud)

现在,如果你的清理

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

    for (i = 0; i < rowcnt; i++){
        free(rows[i]->columns);
    }
    free(rows); 
    exit(0);
}
Run Code Online (Sandbox Code Playgroud)


Oli*_*rth 5

每次对malloc(或realloc)的调用都必须与相应的调用相匹配free.如果您动态分配数组:

int *p = malloc(sizeof(int) * NUM);
Run Code Online (Sandbox Code Playgroud)

你这样释放它:

free(p);
Run Code Online (Sandbox Code Playgroud)

不是这样的:

for (int i = 0; i < NUM; i++)
{
    free(p[i]);
}
Run Code Online (Sandbox Code Playgroud)

您似乎错误地执行了此操作.我怀疑你的清理代码应该是:

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);
}
Run Code Online (Sandbox Code Playgroud)

而且,没有办法匹配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++;
Run Code Online (Sandbox Code Playgroud)