局部变量脱离区域后为啥依然占用内存空间
局部变量脱离区域后为什么依然占用内存空间
#include <iostream>
using namespace std;
void main()
{
if(!0)
{
int a;
cout<<(int)&a<<endl; //1、 ---比如为1245052
}
int b;
cout<<(int)&b<<endl;//2、---比如为1245048
int c;
cout<<(int)&c<<endl;
}
大家可以看到在1的位置为1245052,理论上说a在脱离if体后,a在栈的内存会被释放调,为什么在2的位置居然输出不是1245052而是1245048,说明a还占用着内存。。。怎么解释。。
------解决方案--------------------
在编译和运行是两个概念。
编译时为对应变量分配地址,运行产生值。对不同变量不会去分配相同的地址。
------解决方案--------------------
内存是在运行前分配好的
你的程序等价于
#include <iostream>
using namespace std;
void main()
{
int b;
int c;
if(!0)
{
int a;
cout<<(int)&a<<endl; //1、 ---比如为1245052
}
cout<<(int)&b<<endl;//2、---比如为1245048
cout<<(int)&c<<endl;
}
------解决方案--------------------
块作用域的”释放“指在作用域外不可访问而已,栈上的空间不用释放。
------解决方案--------------------
是的, 函数返回再进入下一个函数的时候会重新把 a 的地址分配给其它变量之类的. 但是这个地址一直都是可用的.
------解决方案--------------------
自动释放是指随着调用栈变化,栈上的空间自行收缩或扩大,不用程序员干预。
------解决方案--------------------
不是这样的 你这几乎是在误导了 函数结束了 不管内存有没有回收 不管里面的值有没有被修改 都已经不能使用了 这是铁律 你的想法脆弱得不堪一击

------解决方案--------------------
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。
------解决方案--------------------
对于各种不同的平台, 不同的编译器, 肯定错误的, 而且是猜不到的.
但对于我正在使用的编译器, 我是可以猜到它会给我生成什么样的代码的. 而且我还可以查看它是不是生成的这样的代码.
这种用法毫无疑问是错误的, 但是用它来理解一下函数变量的实现并无不妥.
#include <iostream>
using namespace std;
void main()
{
if(!0)
{
int a;
cout<<(int)&a<<endl; //1、 ---比如为1245052
}
int b;
cout<<(int)&b<<endl;//2、---比如为1245048
int c;
cout<<(int)&c<<endl;
}
大家可以看到在1的位置为1245052,理论上说a在脱离if体后,a在栈的内存会被释放调,为什么在2的位置居然输出不是1245052而是1245048,说明a还占用着内存。。。怎么解释。。
c++
------解决方案--------------------
在编译和运行是两个概念。
编译时为对应变量分配地址,运行产生值。对不同变量不会去分配相同的地址。
------解决方案--------------------
内存是在运行前分配好的
你的程序等价于
#include <iostream>
using namespace std;
void main()
{
int b;
int c;
if(!0)
{
int a;
cout<<(int)&a<<endl; //1、 ---比如为1245052
}
cout<<(int)&b<<endl;//2、---比如为1245048
cout<<(int)&c<<endl;
}
------解决方案--------------------
块作用域的”释放“指在作用域外不可访问而已,栈上的空间不用释放。
------解决方案--------------------
是的, 函数返回再进入下一个函数的时候会重新把 a 的地址分配给其它变量之类的. 但是这个地址一直都是可用的.
------解决方案--------------------
自动释放是指随着调用栈变化,栈上的空间自行收缩或扩大,不用程序员干预。
------解决方案--------------------
不是这样的 你这几乎是在误导了 函数结束了 不管内存有没有回收 不管里面的值有没有被修改 都已经不能使用了 这是铁律 你的想法脆弱得不堪一击
------解决方案--------------------
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。
------解决方案--------------------
对于各种不同的平台, 不同的编译器, 肯定错误的, 而且是猜不到的.
但对于我正在使用的编译器, 我是可以猜到它会给我生成什么样的代码的. 而且我还可以查看它是不是生成的这样的代码.
这种用法毫无疑问是错误的, 但是用它来理解一下函数变量的实现并无不妥.