Когда освободить память внутри кода C? - PullRequest
3 голосов
/ 10 января 2010

Когда я выделяю память, например, вне цикла while, можно ли освободить ее внутри? Эти два кода эквивалентны?

int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
  free(memory);
}


int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
}
free(memory);

Ответы [ 6 ]

4 голосов
/ 10 января 2010
int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
  free(memory);
}

Это вылетит. Вы устанавливаете указатель на ячейку памяти 10 и затем просите систему освободить память. Крайне маловероятно, что вы ранее выделили часть памяти, которая начинается с 0x10, даже в безумном мире виртуальных адресных пространств. Кроме того, если malloc не удалось, память не была выделена, поэтому вам не нужно ее освобождать.

int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
}
free(memory);

Это тоже ошибка. Если malloc не работает, вы устанавливаете указатель на 10 и освобождаете эту память. (как прежде.) Если malloc преуспевает, то вы немедленно освобождаете память, а это значит, что выделять ее было бессмысленно! Теперь я представляю, что это просто пример кода, упрощенного, чтобы понять суть, и что это не присутствует в вашей реальной программе? :)

4 голосов
/ 10 января 2010

Да, они эквивалентны. Вам не нужно вызывать free(), если выделение не удалось.
Обратите внимание, что memory является указателем на int, и вы должны разыменовать его, чтобы назначить что-то его блоку памяти;

int* memory = NULL;
memory = malloc(sizeof(int));
if (memory)
    *memory=10;
free(memory);
memory = NULL;
3 голосов
/ 10 января 2010

Неважно, если вы уверены, что освободите его только один раз.

Хорошая идея - всегда устанавливать указатель = NULL, когда вы его освобождаете, тогда, если он освободится снова, это не имеет значения

1 голос
/ 10 января 2010

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

1 голос
/ 10 января 2010

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

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

Так что мой совет: что бы вы ни пытались сделать: всегда освобождайте память вне любого цикла / оператора if (если, конечно, вам это больше не нужно). Обычно я освобождаю ее в конце функции, где она использовалась в последний раз, но это действительно зависит от самой функции, ее длины, ....

Попытайтесь найти свой способ ведения дел и придерживаться его: это сэкономит вам много бесполезного мозгового времени (что действительно ценно)

1 голос
/ 10 января 2010

Да. Важная вещь слишком свободна это однажды. (После того, как вы закончили использовать память)

...