天天看點

淺談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;

  我們用debug的方式來一步一步的分析,在watch的視窗下輸入裡面所有的變量。

int i=10;  //i is 10 and &i is 0x0012ff7c

int *j=&i; //*j is 10 and &j is 0x0012ff7c

//顯然可以看出此時兩個變量指的是同一位址

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指向的這塊位址并

  至此,我們分析完了程式的全過程的記憶體配置設定情況,最終結果是這樣的。(圖1)

淺談C++中的記憶體管理
淺談C++中的記憶體管理

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

  對于上面的程式,我們需要改動的是令變量j指向一個位址被釋放的位置。于是就有了下面的程式。

int * foo()

return &l;

j = foo();

  編譯器很“聰明”,編譯後會給出一個警告。原話是“returning address of local variable or temporary”,指向的是上面程式的第四行,也就是return &l;這條語句。那句英文的意思也不用我再多解釋了,相信大家都能看得明白。

這裡還要說一件事情,就是在第一個程式當中,無論是debug版本還是release版本。執行完那個if語句以後,系統都是不會真正的把l清除掉,l隻是k的一個别名。上面的程式是這樣寫的,用了*j=&i這樣一句負值語句,而别名在MSDN中的解釋與引用是相同的,是以也可以這樣了解,int i=10; int &j=i;與上面的相同。不要去想上面這些程式了,大家再看看下面這個。

void f1( int *& j)

void any_function_use_local_variables()

int a,b,c;

a=b=c=100;

f1(j);

any_function_use_local_variables();

  請大家自己編譯、執行,看看結果是什麼,然後結合上面的兩個例子,想想是為什麼。下面再給大家一個小例子,可能會有助于了解記憶體的概念。

  程式的過程是試圖去增加i,使之超過最大的整數。有一種情況是這個值被“卷回來”變成一個負數,在我的機器上程式的列印結果是-2147483648,這個結果可能因為硬體的不同而不同。

int i=1;

while(0<i) i++;

cout<<i;

  結束。

專注于企業資訊化,最近對股票資料分析較為感興趣,可免費分享股票個股主力資金實時變化趨勢分析工具,股票交流QQ群:457394862

本文轉自滄海-重慶部落格園部落格,原文連結:http://www.cnblogs.com/omygod/archive/2006/11/08/554570.html,如需轉載請自行聯系原作者

繼續閱讀