在使用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;
负责尝试释放内存的代码:
- 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错误,并且自由(& rows [i])抱怨双重空格.我对C很新,并且会感谢任何人可能拥有的任何指针(ahem).
解决方法
做行[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);
- }