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

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

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

Пример:

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

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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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