局部变量内存释放有关问题
局部变量内存释放问题
int main()
{
while(1)
{
int data;
........
}
}
各位大侠,这个int data的内存使用是什么情况,每次while,都需要重新分配吗?还是while一次完后自动回收?请详解,散分了。
------解决思路----------------------
自动变量, 自动地在栈上或者寄存器存储, 无需关心本身的释放问题.
C++因为引入了类, 有构造/析构函数一说, 稍微麻烦点.
不过int不存在这个问题, 放心用.
------解决思路----------------------
{
int data;
........
}
{}都被作为一个程序块对待,进入循环体分配一次内存,但是循环结束之前不会重新分配内存
------解决思路----------------------
局部变量在函数调用的时候一次性分配好内存,但初始化根据声明的位置。
------解决思路----------------------
局部变量在函数调用的时候一次性分配好内存,但初始化根据声明的位置。
------解决思路----------------------
为了验证写了几行代码:
下面是汇编代码,可以看到8行-9行是对应x变量的:没有每次重新分配内存。
------解决思路----------------------
又将代码稍微修改了一下,下面的截图也印证了上面的结论:x没有在while循环里被重复申请。

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