Когда автоматическая память освобождена?

Возможный дубликат:
Можно ли получить доступ к памяти локальной переменной вне ее области?

Когда автоматическая память освобождена?

void fun3(int a){
    a = 5;
}

Освобождается ли "a" после завершения функции?

Да!

Так в чем же причина этого вывода? http://ideone.com/2ZJ57

3 ответа

Решение

Да a освобождается, когда заканчивается область действия функции.

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

Ваша программа делает именно это, поэтому она имеет неопределенное поведение (UB). С помощью UB ваша программа может показать любое поведение, действительное или недействительное.Ссылка 1.

Ссылка 1C++ 03, раздел 1.3.24:

Допустимое неопределенное поведение варьируется от полного игнорирования ситуации с непредсказуемыми результатами до поведения во время перевода или выполнения программы документированным образом, характерным для среды (с выдачей диагностического сообщения или без него), до прекращения перевода или выполнения (с выдачей диагностического сообщения).

Технически, память, где a был сохранен, доступен для нас в других контекстах, поэтому, чтобы ответить на ваш вопрос, да.

Это зависит от некоторых факторов, хотя. Там может даже не быть памяти, чтобы говорить о. В вашем конкретном примере оптимизатор может просто отключить все. Даже если вы делаете что-то вроде cout << a, 5 может быть встроенным, который не находится в памяти.

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

Кроме того, только потому, что он освобожден, это не означает, что память автоматически очищается впоследствии. Значение может оставаться там до тех пор, пока эта память не будет повторно использована.

Ваш пример демонстрирует неопределенное поведение:

void fun3(int *&p, int a){
        p = &a;
}

a является локальной переменной, и вы берете ее адрес и назначаете его p, который вы затем используете вне функции. Все может случиться.

Да, хранилище выделено для a освобождается при выходе из функции.

Другие вопросы по тегам