Есть ли вред в вызове 'free' для одного и того же указателя дважды в программе на C? - PullRequest
11 голосов
/ 18 мая 2011

Если у меня есть программа переменного тока, например:

SomeTypePtr my_type;
my_type = malloc(sizeof(someType));

/* do stuff */

free(my_type);

/* do a bunch of more stuff */

free(my_type);

Вредит ли вызов 'free' для my_type?После того, как я позвоню free (my_type), станет ли указатель снова нулевым?

Ответы [ 4 ]

12 голосов
/ 18 мая 2011

Выделение области памяти с помощью free не делает содержимое указателя NULL.Предположим, что у вас есть int *a = malloc (sizeof (int)), а a имеет 0xdeadbeef, и вы выполняете free (a), затем после выполнения a все еще содержит 0xdeadbeef, но после вызова free этот адрес памяти больше не зарезервирован для вас.Что-то вроде того, что вы сняли квартиру с malloc, использованным в течение некоторого времени, вернули квартиру на free, тогда у вас может быть дубликат ключа для квартиры, но он не зарезервирован для вас.

Выполнениеfree в уже free d памяти приведет к двойному повреждению свободной памяти.

4 голосов
/ 18 мая 2011
  1. Это не сделает ваш указатель NULL.
  2. Это освободит память, указанную указателем, оставив указатель на незанятом сегменте памяти.
  3. Если вы не используете malloc или calloc между вызовами, это приведет к ошибке сегментации.
  4. «Рекомендуется, чтобы указатель выходил из области видимости сразу после освобождения». означает, что указатель должен оставаться в стеке, чтобы он не устанавливался в NULL явно, поскольку он в конечном итоге выйдет за пределы области и будет освобожден.
3 голосов
/ 18 мая 2011

Не повторяя другие ответы, вы обязаны обнулять указатели, как только вы позвоните 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.
3 голосов
/ 18 мая 2011

Только если вы считаете уничтожение вашей кучи "вредом".free() не сделает указатель нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...