Почему я должен освободить указатель после его использования ??? (ANSI-C), - PullRequest
2 голосов
/ 01 июня 2011

Я прочитал это: http://www.drpaulcarter.com/cs/common-c-errors.php#2.8 и есть такой блок кода:

#include <string.h>
#include <stdlib.h>
int main()
{
  char *st = malloc(20);   /* st points to allocated array*/

  strcpy(st, "abc");  /* st points to char array */
  free(st);                /* don't forget to deallocate when done! */
  return 0;
}

Ответы [ 6 ]

5 голосов
/ 01 июня 2011

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

Код - это просто упрощенный пример выделения и освобождения памяти, в реальной программе вы будете отслеживать память, которая должна была быть освобождена во время работы программы, в противном случае вам не хватит памяти (или, скорее, адресного пространства)

3 голосов
/ 01 июня 2011

Эффекты выделения и освобождения памяти. Как только вы выделяете память для какой-то цели, она остается выделенной, пока вы не освободите ее.Пока он выделен, он не доступен для других целей.Причиной освобождения является необходимость сделать эту память доступной для других целей.

Почему это важно. Это становится важным, если ваша программа продолжает выделять новые порции памяти с течением времени.Если вы не освобождаете память, когда она вам больше не нужна, использование памяти вашей программой растет, растет и растет и может в конечном итоге исчерпать пул памяти, который операционная система делает доступным для нее.

Никакого реального вреда в этом примере. В конкретном примере вы (вероятно) не повредите, пропуская освобождение.Во-первых, программа заканчивается сразу после этого, поэтому программа больше не использует эту память.С другой стороны, как уже упоминали другие, в типичных реализациях C ваша программа возвращает всю свою память при выходе.

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

Память, а не указатель, освобождается. Строго говоря, этот пример не освобождает указатель.Это освобождает память, на которую указывает указатель.Указатель все еще там, и фактически все еще указывает на освобожденную память.Это может привести к бесконечной радости отладки, если вы по неосторожности продолжите использовать указатель, как если бы он все еще указывал на принадлежащую ему память.

3 голосов
/ 01 июня 2011

Вы должны освободить его (через free()), потому что вы выделили его (через malloc()).В большинстве C API, как правило, вы несете ответственность за освобождение указателя, если вы выделяете его.В некоторых случаях это не так, но на справочной странице функции это обычно указывается.

2 голосов
/ 01 июня 2011

Нет гарантии, что выделенная память вернется к системным ресурсам только потому, что процесс завершен.

1 голос
/ 01 июня 2011

В противном случае распределитель памяти C не знает, что вы закончили с его использованием.

1 голос
/ 01 июня 2011

В функции main () после выхода из программы вся выделенная память возвращается обратно в ОС, даже если вы не освобождаете ее явно.Выполнение этого вручную обычно называют хорошей практикой, эта «хорошая практика» имеет реальные последствия.Если бы вы имели этот код в другой функции или даже внутри main и в цикле, ваша программа выделяла бы и освобождала память согласно коду.Если бы у вас был код в цикле и без освобождения, это, в конечном счете, могло бы поглотить всю вашу память, что привело бы к аварийному завершению работы вашей программы без обработки.В определенных условиях это называется утечкой памяти.Итак, хорошо знайте хорошие практики! утечка памяти

...