При отладке моей программы с помощью 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);
}
Объявление строки:
typedef struct {
char** columns;
unsigned short int numcol;
} Row;
Row* rows = NULL;
Хуже того, эта программа иногда вызывает ошибку glibc на free(&rows[i])
, которая жалуется на двойное освобождение. Я новичок в C, и был бы признателен за любые указатели (хм) кто-то может иметь.