龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C++内存管理的探讨(1)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
下边开始对 C++内存管理 进行探讨: 先看一段程序: int main() { int i=10; int *j=i; if (!0) { int l=20; int *k=l; j=k; k=0; } cout*j; return 0; } 不用编译器,大家想想执行过之后应该打印什么结果?我想大

下边开始对C++内存管理进行探讨:

先看一段程序:

  1. int main()  
  2. {   
  3. int i=10;   
  4. int *j=&i;   
  5. if(!0)  
  6. {   
  7. int l=20;  
  8. int *k=&l;  
  9. j=k;  
  10. k=0;  
  11. }  
  12. cout<<*j;  
  13. return 0;  

不用编译器,大家想想执行过之后应该打印什么结果?我想大家的第一反应应该是打印出一个不确定的数。理由是在if语句里,我们定义了k这个变量,在if执行结束之后,这个变量k所占据的内存是被系统收回的,于是也就造成了变量j所指的结果非常不确定。当然,如果编译并且执行过后,我们发现事情并不是像我们想象的那样,程序最终的打印结果是20,并不是我们期待的一个不确定的数。下面就让我们分析一下原因吧!

我们用debug的方式来一步一步的分析,在watch的窗口下输入里面所有的变量。

  1. int i=10;  //i is 10 and &i is 0x0012ff7c   
  2. int *j=&i; //*j is 10 and &j is 0x0012ff7c   
  3. //显然可以看出此时两个变量指的是同一地址   
  4. if(!0)  
  5. {  
  6. int l=20; //l is 20 and &l is 0x0012ff74   
  7.  
  8. /*地址0x0012ff7c—0x0012ff75被占据。要说明的是,  
  9. 这个数值很有可能因为电脑硬件的不同而不同。*/   
  10.  
  11. int *k=&l; //*k is 20 and &k is 0x0012ff74   
  12.  
  13. //变量k与l指向同一地址。   
  14.  
  15. j=k;  //j is 0x0012ff74 and *j is 20  
  16.  
  17. /*指针间的赋值,这个语句的意思是把k指向的地址负值给j。  
  18. 此时这两个变量指向的是同一个地址,都是0x0012ff74,而那  
  19. 块地址存放的是20,所以也就有*j是20的原因。*/   
  20. }  
  21.  
  22. cout<<*j; //*j is 20 and j is 0x0012ff74   
  23.  
  24. /*此时同时可以看到k的地址是0x00000000,说明k这个变量  
  25. 已经被自动销毁,所以地址指零。但是j所指的并不是k,而  
  26. 是k所指的那段地址0x0012ff74,而由于此时j的生存周期还  
  27. 没有结束(j是在if意外定义的),所以j指向的这块地址并  
  28. 没有被收回,也就保存下来20这个数了。*/  

至此,我们分析完了程序的全过程的内存分配情况,最终结果如下图所示:

内存分配 

我们同时也可以在Memory里面看看这个地址的具体内容。我们可以看到是14,这是十六进制的数,化成十进制,正好是20。如下图所示:

 

现在大家应该对上面那个程序的执行过程有一个大概地了解了吧!不过这个还不是我们想要得到的结果,我们需要的是打印一个不确定的结果。有了以上的分析,我们开始新的程序,让他打印出我们想要的东西。


精彩图集

赞助商链接