Итак, у меня есть эта структура:

typedef struct type {
      int a;
      char* b;
} type;

В программе main я делаю 2 массива этих структур и использую malloc():

type *v;
type *w;
v=malloc(50*sizeof(type));
w=malloc(50*sizeof(type));

Теперь, если я хочу освободить эти массивы структур, правильно ли это сделать:

free(v);
free(w);

?

1
odin19 2 Фев 2016 в 18:19

2 ответа

Лучший ответ

Это будет правильно при условии, что вы не выделили память для элемента данных

char* b;

Элементов массивов.

В противном случае вам нужно сначала освободить память, на которую указывает этот член данных, и только затем освободить исходные указатели.

Например

for ( size_t i = 0; i < 50; i++ ) free( v[i].b );
free( v );

Учтите, что если этот член данных был инициализирован адресом строкового литерала, вы не должны освобождать эту память, потому что строковые литералы имеют статическую продолжительность хранения.

2
Vlad from Moscow 2 Фев 2016 в 15:25

Да, это правильно. Вам нужно только передать указатель, возвращаемый malloc() и семьей.

Вам не нужно указывать / указывать размер выделенной памяти при вызове free(). Размер будет заботиться автоматически (ОС).

FWIW, в случае, если вы выделили динамическую память для элементов, например w[i].b, вам нужно сначала free() их, потому что, как только вы вызовете free() на w, вся память, выделенная в w[i].b, станет недоступной, следовательно, ваша программа будет терять память.

5
Sourav Ghosh 2 Фев 2016 в 15:30