Есть ли вред в вызове "бесплатно" для одного и того же указателя дважды в программе на 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.