Cześć, mam taki kod niestety wyrzuca mi program ze wzgledu na wyciek pamięci. Wykazuje ze wyciek jest w tych liniach co zaznazyłem na czerwono i pogrubiłem. Jednak mimo tego, że probowalem zwalniac tmp_tab oraz tmp_row nie udaje mi się tego powstrzymać. Jak to poprawnie zwolnic? :(
int load(const char* filename, int*** ptr, enum save_format_t format)
{
if (filename == NULL || ptr == NULL)
return 1;
FILE* fp;
if (format == fmt_text) {
if ((fp = fopen(filename, "r")) == NULL)
{
return 2;
}
}
else {
if ((fp = fopen(filename, "rb")) == NULL)
{
return 2;
}
}
int val;
int** tab = malloc(sizeof(int*));
size_t tab_size = 0;
int* row = NULL;
size_t row_size = 0;
int* tmp_row = NULL;
if (format == fmt_text) {
while (fscanf(fp, "%d", &val) == 1)
{
tmp_row = realloc(row, sizeof(int) * (row_size + 1));
if (tmp_row == NULL) {
free(row);
destroy(&tab);
fclose(fp);
return 4;
}
row = tmp_row;
row[row_size++] = val;
if (val == -1) {
int** tmp_tab = realloc(tab, sizeof(int*) * (tab_size + 1 + 1));
if (tmp_tab == NULL) {
destroy(&tab);
fclose(fp);
return 4;
}
tab = tmp_tab;
tab[tab_size++] = row;
tab[tab_size] = NULL;
row = NULL;
row_size = 0;
}
}
free(tab);
}
else {
while (fread(&val, sizeof(int), 1, fp) == 1)
{
tmp_row = realloc(row, sizeof(int) * (row_size + 1));
if (tmp_row == NULL) {
destroy(&tab);
free(row);
fclose(fp);
return 4;
}
row = tmp_row;
row[row_size++] = val;
if (val == -1) {
int** tmp_tab = realloc(tab, sizeof(int*) * (tab_size + 1 + 1));
if (tmp_tab == NULL) {
destroy(&tab);
free(row);
fclose(fp);
return 4;
}
tab = tmp_tab;
tab[tab_size++] = row;
tab[tab_size] = NULL;
row = NULL;
row_size = 0;
}
}
free(tmp_row);
}
fclose(fp);
return 0;
}