前一段时间在一个好友的的博客论坛上看到他学习C++时碰到的一小点问题,是关于C++中最基本的内存分配方面的。其实对于内存这东西,除了知道我自己用的是256M的内存以外,我也不太清楚他到底里面是怎么工作的。看了大师们的讲解,我深有体会,把这些讲解整理出来,为所有C++的newbie们共勉! 正文: 事情是因为这样一小段程序而来的。int main() { int i=10; int *j=&i; if(!0) { int l=20; int *k=&l; j=k; k=0; } cout*j; return 0; } 不用编译器,大家想想执行过之后应该打印什么结果?我想大家的第一反应应该是打印出一个不确定的数。理由是在if语句里,我们定义了k这个变量,在if执行结束之后,这个变量k所占据的内存是被系统收回的,于是也就造成了变量j所指的结果非常不确定。当然,假如编译并且执行过后,我们发现事情并不是像我们想象的那样,程序最终的打印结果是20,并不是我们期待的一个不确定的数。下面就让我们分析一下原因吧! 我们用debug的方式来一步一步的分析,在watch的窗口下输入里面所有的变量。int i=10; //i is 10 and &i is 0x0012ff7c int *j=&i; //*j is 10 and &j is 0x0012ff7c //显然可以看出此时两个变量指的是同一地址 if(!0) { int l=20; //l is 20 and &l is 0x0012ff74 /*地址0x0012ff7c—0x0012ff75被占据。要说明的是, 这个数值很有可能因为电脑硬件的不同而不同。*/ int *k=&l; //*k is 20 and &k is 0x0012ff74 //变量k与l指向同一地址。 j=k; //j is 0x0012ff74 and *j is 20 /*指针间的赋值,这个语句的意思是把k指向的地址负值给j。 此时这两个变量指向的是同一个地址,都是0x0012ff74,而那 块地址存放的是20,所以也就有*j是20的原因。*/ }cout*j; //*j is 20 and j is 0x0012ff74 /*此时同时可以看到k的地址是0x00000000,说明k这个变量 已经被自动销毁,所以地址指零。但是j所指的并不是k,而 是k所指的那段地址0x0012ff74,而由于此时j的生存周期还 没有结束(j是在if意外定义的),所以j指向的这块地址并 没有被收回,也就保存下来20这个数了。*/ 至此,我们分析完了程序的全过程的内存分配情况,最终结果是这样的。(图1)