2014-01-08 3 views
1

Когда я объявляю переменную в функции, я использую некоторую память. Когда функция выполняется, выполняя свою работу, освобождается ли память?Где переменные функции идут?

+1

Вы когда-нибудь слышали о «стеке»? - Я предполагаю, что вы говорите об основном типе, иначе можно было бы использовать кучу, и ее память освобождается, когда var выходит за рамки (или аналогично), если класс предоставляет правильный деструктор ... (Нет, если вы конечно, создал экземпляр с новым: в этом случае это ваш долг) – ShinTakezou

+0

Пожалуйста, не просто отправляйтесь и делайте предположения. –

ответ

6

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

void foo() 
{ 
    int x; 
    int* y = new int; 
    //You get a memory leak with each call to foo without the following line 
    delete y; 
} //x is freed here 
+1

Нет такой вещи, как динамические переменные. Есть только динамические * объекты *. Все переменные охвачены; они имеют ту же область, что и их имя. (Так что 'y' просто выходит из сферы действия, как и должно быть, и все хорошо.) –

+1

@KerrekSB Это какая-то шутка? –

+0

@ScepticalJule: Нет, он пытается исправить ошибочный ответ :-) –

1

Возможно, самое главное это вы понимаете понятия стека и кучи и этот пост, как очень хорошие объяснения по этому вопросу:

What and where are the stack and heap?

Одаренность в сторону (auto_ptrs и т.п.), суть его в том, что, если они выделяются в стеке, то они будут освобождены, когда они Lea В этом случае вы должны сами позаботиться о том, чтобы освободить их. Если вы поймете вышеизложенное, вы лучше поймете, что искать.

+0

Вы должны прочитать о продолжительности автоматического и динамического хранения, потому что вы неправильно поняли «стек и кучу». –

+0

@ Планы на орбите - это не то, что я неправильно понял стек и кучу ИМО, но вы правы, что в терминах на С ++ я должен был описать это в этих терминах. В конце ваши переменные могут быть только в стеке или куче, и вы освобождаете их только тогда, когда стек отключается или вы вызываете функции дезактивации, соответственно. Но я все-таки понимаю вашу точку зрения! – RMo

+0

Вы имеете в виду «объекты», а не «переменные», и они могут быть абсолютно чем-то иным, чем стек или куча. _В этом-то и дело! :) –

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