局部变量内存释放有关问题

局部变量内存释放问题
int main()
{
      while(1)
      {
             int data;
             ........
      }
}

各位大侠,这个int data的内存使用是什么情况,每次while,都需要重新分配吗?还是while一次完后自动回收?请详解,散分了。
------解决思路----------------------
自动变量, 自动地在栈上或者寄存器存储, 无需关心本身的释放问题.
C++因为引入了类, 有构造/析构函数一说, 稍微麻烦点. 
不过int不存在这个问题, 放心用.
------解决思路----------------------
 {
             int data;
             ........
      }

{}都被作为一个程序块对待,进入循环体分配一次内存,但是循环结束之前不会重新分配内存
------解决思路----------------------
局部变量在函数调用的时候一次性分配好内存,但初始化根据声明的位置。
------解决思路----------------------
局部变量在函数调用的时候一次性分配好内存,但初始化根据声明的位置。
------解决思路----------------------
为了验证写了几行代码:
int _tmain(int argc, _TCHAR* argv[])
{
int n=0;
while(n < 5)
{
int x=n;
n++;
}
return 0;
}

下面是汇编代码,可以看到8行-9行是对应x变量的:没有每次重新分配内存。

int n=0;
004125DE  mov         dword ptr [n],0 
while(n < 5)
004125E5  cmp         dword ptr [n],5 
004125E9  jge         main+3Ch (4125FCh) 
{
int x=n;
004125EB  mov         eax,dword ptr [n] 
004125EE  mov         dword ptr [x],eax 
n++;
004125F1  mov         eax,dword ptr [n] 
004125F4  add         eax,1 
004125F7  mov         dword ptr [n],eax 
}
004125FA  jmp         main+25h (4125E5h) 
return 0;
004125FC  xor         eax,eax 

------解决思路----------------------
又将代码稍微修改了一下,下面的截图也印证了上面的结论:x没有在while循环里被重复申请。
局部变量内存释放有关问题

截图表达的意思是:在x被赋值为0前,它的值仍然保留上次循环时的值。
------解决思路----------------------
栈上的变量只会分配一次内存,你说的重复分配永远不成立,只要函数没退出,这个变量就在哪儿,不存在重复申请一说。
X被保留之前的值很正常,X一直在那里,不保留才奇怪了。
你的问题其实应该这样理解,变量在哪里定义,就在哪里执行构造函数,离开相同视口时执行析构函数。你这个int测试没有说服力,因为int的默认构造函数和析构函数什么事都不做,建议创建一个类来做测试,然后检查构造/析构函数什么时候被调用。
------解决思路----------------------
楼上说的不正确,必然是每次循环重新分配,变量作用域只在大括号内部,所以下一次循环就是重新申请的了,只是可能还是分配在了原来的地址,所以可能初值也将会是上次记录的值。如果需要只申请一次,就把data放到whiel外面
另外楼主可以测试类对象


class A
{
public:
~A() 
{
//输出.....
}
};

int main()
{
      while(1)
      {
            A data;
      }
  return 0;
}


楼主可以测试如上类对象,就知,析构函数每次循环都会调用一次
------解决思路----------------------
局部变量内存释放有关问题理解讨论之前请先学会如何观察

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
局部变量内存释放有关问题多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)