下邊開始對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;
- }
不用編譯器,大家想想執行過之後應該打印什麼結果?我想大家的第一反應應該是打印出一個不確定的數。理由是在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這個數了。*/
至此,我們分析完了程序的全過程的內存分配情況,最終結果如下圖所示:
我們同時也可以在Memory裡面看看這個地址的具體內容。我們可以看到是14,這是十六進制的數,化成十進制,正好是20。如下圖所示:
現在大家應該對上面那個程序的執行過程有一個大概地了解了吧!不過這個還不是我們想要得到的結果,我們需要的是打印一個不確定的結果。有了以上的分析,我們開始新的程序,讓他打印出我們想要的東西。