2009-08-26 2 views
10

Очень похоже на my previous question, но я нашел, что это отдельный вопрос, и я не могу найти надежный ответ на этот вопрос.Является ли память массива (символа) свободным, выходя из области видимости?

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

Пример:

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

Таким образом, после вызова method1, является память, используемая Str (10 байт), освобожденного, или мне нужно явно вызвать бесплатно на это, а?

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

ответ

18

В этом случае нет, вам не нужно звонить бесплатно. Значение «str» - это значение на основе стека, которое будет очищено, когда будет выведен этот конкретный метод/область.

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

+1

(Где «нет» означает - да, это бесплатно, если выйти из сферы действия, и нет, вам не нужно явно звонить бесплатно) – jmanning2k

+0

@ jmanning2k я также перечитываю свое сообщение и редактировал его немного более ясно, что означает «нет» – JaredPar

1

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

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

9

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

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

+0

Отличный совет! – Lazarus

+0

Я действительно читал (и изучал) язык программирования C от K & R, но это было какое-то время назад, и до того, как я на самом деле «вошел» в C, я немного больше. – pbean

0

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

0

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

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

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

+0

Вопрос о C, а не C++ – 2009-08-26 16:56:29

+0

А, да, действительно. Позвольте мне это исправить. –

3

Да, это «освобождено». (Not free() 'ed, хотя.)

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

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

2

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

0

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

Смежные вопросы