Освобождается ли память (символьного) массива, выходя из области видимости? - PullRequest
11 голосов
/ 26 августа 2009

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

Освобождается ли память, используемая (символьным) массивом, выходя из области видимости?

Пример:

void method1()
{
  char str[10];
  // manipulate str
}

Итак, после вызова метода1 освобождается ли память, используемая str (10 байт), или мне тоже нужно явно вызвать free?

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

Ответы [ 8 ]

18 голосов
/ 26 августа 2009

В этом случае нет необходимости звонить бесплатно. Значение "str" ​​является значением на основе стека, которое будет очищено при выходе из этого конкретного метода / области.

Вам нужно вызывать free только для значений, которые явно созданы через malloc.

9 голосов
/ 26 августа 2009

Это автоматически освобождается. Если вы не сделали это неправильно, вы не нужно освобождать это. Но это не имеет ничего общего с «простой массив примитивных типов» - он был бы освобожден, если бы массив структур. Он освобожден, потому что это локальная переменная.

Учитывая, что вы задаете эти самые основные вопросы, Я должен спросить, какой учебник C вы используете. Лично я не верю, что вы можете с пользой изучить C без читая Kernighan & Ritchie's Язык программирования C , который объясняет все это очень четко.

3 голосов
/ 26 августа 2009

Да, это "освобождено". (Не бесплатно (), хотя.)

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

Обратите внимание, что вы освобождаете только () то, что вы malloc ().

2 голосов
/ 26 августа 2009

Да, память освобождается автоматически после возврата method1. Память для str выделяется в стеке и освобождается после очистки кадра стека метода. Сравните это с памятью, выделенной в куче (через malloc), которую вы должны явно освободить.

1 голос
/ 26 августа 2009

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

Если вы используете malloc(), то пространство выделяется в куче, которая должна быть явно освобождена.

0 голосов
/ 26 августа 2009

В последнее время я немного заржавел в C / C ++, но я думаю, что вы правы. Пока вы не распределяете эту память динамически, все будет в порядке.

0 голосов
/ 26 августа 2009

Да, он «освобождается», когда выходит из области видимости.
Нет, вам не нужно явно освобождать его.

Массив char размещается в стеке, поэтому при возврате из функции это пространство стека можно использовать повторно. Вам не нужно явно освобождать память.

Хорошее правило: если вы malloc, вы должны free.

0 голосов
/ 26 августа 2009

Я думаю, что он освобожден не потому, что это примитивы, а что это локальная переменная, которая будет размещена в стеке, а не в куче. Если вы не используете malloc, вы не сможете освободить его, насколько я помню.

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