2012-04-28 6 views
0

Можно создать дубликат:
Can a local variable's memory be accessed outside its scope?Когда автоматическая память освобождена?

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

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

Выполняется ли «а» при завершении функции?

Да!

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

+0

Тот факт, что вы можете распечатать адрес памяти, не означает, что вы можете (юридически) манипулировать им. –

ответ

1

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

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

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

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

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

+0

Неопределенное поведение! Что это значит ? – faressoft

+0

@faressoft: [Undefined Behavior] (http://en.wikipedia.org/wiki/Undefined_behavior) –

+0

Вы имеете в виду, что после окончания функции нет значения 10 в памяти? – faressoft

1

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

2

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

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

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

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

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

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

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

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