Есть ли вред в вызове "бесплатно" для одного и того же указателя дважды в программе на C?
Если у меня есть c-программа, например:
SomeTypePtr my_type;
my_type = malloc(sizeof(someType));
/* do stuff */
free(my_type);
/* do a bunch of more stuff */
free(my_type);
Призывает ли "бесплатный" для my_type какой-либо вред? После вызова free (my_type) указатель снова станет нулевым указателем?
Ответы
Ответ 1
Освобождение области памяти с помощью free
не делает содержимое указателя NULL. Предположим, что у вас есть int *a = malloc (sizeof (int))
и a
имеет 0xdeadbeef
, и вы выполняете free (a)
, после выполнения a
все еще содержит 0xdeadbeef
, но после вызова free
этот адрес памяти больше не зарезервирован для вас. Что-то вроде вы арендовали квартиру с malloc
, которая использовалась в течение некоторого времени, вернула квартиру на free
, тогда у вас может быть дубликат ключа для квартиры, но он не зарезервирован для вас.
Выполнение free
в уже имеющейся памяти free
d приведет к двойному повреждению свободной памяти.
Ответ 2
- Он не сделает ваш указатель NULL.
- Он освободит память, указанную указателем, оставив указатель установленным в нераспределенном сегменте памяти.
- Если вы не используете malloc или calloc между вызовами, это даст вам ошибку сегментации.
- "Лучшая практика заключается в том, что указатель выходит из сферы действия сразу после освобождения". означает, что указатель должен оставаться в стеке, так что он не должен быть установлен NULL явно, потому что он в конечном итоге выйдет из области действия и будет освобожден.
Ответ 3
Только если вы считаете, что уничтожаете свою кучу "вред". free()
не сделает ваш указатель нулевым.
Ответ 4
Не повторяя другие ответы, вы должны называть нулевые указатели после вызова free()
. Вызов free()
дважды при том же распределении приведет к повреждению кучи.
SomeTypePtr my_type;
my_type = malloc(sizeof(someType));
/* do stuff */
free(my_type);
my_type = 0; // Throw away the pointer to released memory, so cannot either free it or use it in any way.
/* do a bunch of more stuff */
free(my_type); // OK now - calling free(0) is safe.