память, примитивы и с - PullRequest
       1

память, примитивы и с

2 голосов
/ 28 апреля 2011

Скажем, я объявляю примитивы или массивы примитивов (справа от стека).Как мне «освободить» или очистить их, чтобы они не брали / не вытекали из памяти?

Например:

int blah;
blah=7;
doSomethingWithBlah...
free(blah) //[?]

вероятно, не так уж и нормально;но что, если бы вы сказали огромный массив символов или что-то еще?

также любые «локальные» переменные (то есть внутри функции) будут по умолчанию автоматически определены и автоматически очищены (в терминах Java они GCed при выходе из области видимости).

Просто любопытно, спасибо.

Ответы [ 5 ]

1 голос
/ 28 апреля 2011

Вы не.

Стек - это структура данных. Это LIFO (Last In, First Out), что означает, что последнее, что было помещено в стек, является первым, которое будет удалено из стека. Вот как вы можете думать об этом в программировании:

main -> foo

Основная функция (точка входа) вызывает некоторую функцию foo. Некоторые переменные объявлены / определены в главной функции. Другие объявлены в функции foo, которые находятся на другом уровне области видимости.

Когда вы входите в программу, все переменные, объявленные в main, помещаются в блок стека. То же самое с foo, когда он вызывается, но следующий блок. Затем, когда он достигает конца функции foo, он выталкивает этот набор переменных из стека (или «освобождает» их). Когда он достигает конца основной функции, он выталкивает этот набор переменных из стека.

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

Вы просто беспокоитесь о том, что кладете в кучу, когда вы используете «malloc» в C или «new» в C ++.

1 голос
/ 28 апреля 2011

Вы не можете.Переменные стека «освобождаются», когда выходят из области видимости (в конце содержащего блока).

Большие структуры / массивы / и т.д., которые вы размещаете в куче.

Обратите внимание, что вы говорите "в терминах Java, они GCed при выходе из области видимости" ..Это неправильно и плохой способ думать о вещах.Все объекты в java создаются в куче и становятся доступными для сборщика мусора, когда на них нет оставшихся ссылок на них.Это очень, очень отличается от C, где вы можете создавать вещи в стеке и (неправильно) возвращать указатели на них вызывающей стороне.

1 голос
/ 28 апреля 2011

Вы не «чистите» или «освобождаете» данные из стека, в этом нет необходимости, так как память снова доступна для использования после возврата функции. Так что blah не следует "очищать" (но вы не можете передать ссылку на него, если функция вернет либо ...)

1 голос
/ 28 апреля 2011

Насколько мне известно, локальные переменные, объявленные в стеке в C, будут выделены как часть записи активации функции, и, следовательно, будут возвращены после возврата функции.способ «освободить» данные, объявленные в стеке.

1 голос
/ 28 апреля 2011

Локальные переменные в стеке перестают существовать при разрушении кадра стека (т.е. когда функция возвращается).Невозможно удалить их, пока их стековый фрейм еще существует.

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

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