程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++內存管理的探討(1)

C++內存管理的探討(1)

編輯:C++入門知識

下邊開始對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。如下圖所示:

 

現在大家應該對上面那個程序的執行過程有一個大概地了解了吧!不過這個還不是我們想要得到的結果,我們需要的是打印一個不確定的結果。有了以上的分析,我們開始新的程序,讓他打印出我們想要的東西。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved