【发布时间】:2011-06-23 11:37:37
【问题描述】:
在使用 Valgrind 调试我的程序时,我发现了内存泄漏,尽管我认为是对 free 的有效调用。首先,分配内存并存储它的代码:
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);
}
Row 的声明:
typedef struct {
char** columns;
unsigned short int numcol;
} Row;
Row* rows = NULL;
更糟糕的是,这个程序有时会在free(&rows[i]) 处导致一个 glibc 错误,抱怨双重释放。我是 C 新手,希望有人能提供任何指点(咳咳)。
【问题讨论】:
-
需要包含Row类型的声明。
-
可以在这里使用更多代码。目前我有点困惑,为什么你
malloc为一行中的每一列留出空格,然后将 row->numcol 设置为零。 -
free()知道malloc()分配的内存块大小,并将释放整个块。看起来您正在遍历该块并尝试释放部分内存块。 -
@ustun:我也喜欢 clang,但这对这里有什么帮助?
-
@Lucas 我不确定,但 clang 静态分析器(不是编译器)有时有助于解决内存泄漏问题。
标签: c memory pointers valgrind