2012-02-02 3 views
2

Если я объявляю массив внутри функции, память освобождается при выходе из функции?C++ - Объявление массивов внутри функций

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

Уточнение было бы очень признательно.

Заранее спасибо.

ответ

2

Массив, объявленный в функции, выделяется в стеке программы. Когда ваша программа выходит из этой функции, локальные переменные в стеке выгружаются, а память, содержащая массив, больше недоступна. Альтернативой является новый указатель на массив, который выделяется на кучу программы, выдержит функцию выхода и должен быть затем удалить 'd или утечка памяти.

Довольно общее описание стека программы представляет собой блок памяти, выделенный для хранения локальных переменных для ваших функций. Когда вызывается функция, объем памяти, необходимый для хранения локальных переменных для этой функции, помещается в верхнюю часть стека, т. Е. Указатель стека перемещается вверх на эту величину. Когда функция выходит, то точный объем памяти удаляется с вершины стека, и указатель стека возвращается к своему предыдущему местоположению до вызова функции. С другой стороны, куча программ - это память, которая не имеет семантики стека и используется, когда функция запрашивает блок памяти . Затем программа отвечает за управление освобождением этой памяти.

Smart pointers часто используются в C++ для автоматической обработки выделения и освобождения памяти, чтобы избежать ошибок/утечек памяти, связанных с управлением памятью.

Быстрый google поднял this explanation of stack versus heap in C++.

+0

Большое спасибо! Мы были введены (кратко) в кучу и стек в курсе Инженерного программирования, но я не понимаю различия. Не могли бы вы объяснить или указать мне в сторону каких-либо хороших ресурсов? Еще раз спасибо! – JonaGik

+1

@JonaGik: см. Http://stackoverflow.com/q/79923/10077 –

+1

Подумайте о каждой переменной в системе в виде табличек. Когда вы вводите функцию, параметры и локальные переменные добавляются в стек табличек, где они становятся грязными и используются. Когда вы покидаете функцию, ваши пластины должны быть очищены, поэтому их бросают в раковину. Куча больше похожа на таблицу с карточками имен (адресами). Вы можете поместить любую табличку на стол с новым, и любой может использовать ее, если они знают имя (то есть адрес), но вам в конечном итоге придется очистить после себя удаление. Никто не любит грязный стол :-) – Joel

4

Все автоматические переменные удаляются после выхода функции, включая массивы. Это, как правило, все нестатические локальные переменные.

+3

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

+0

Вы правы. Ред. – Joel

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