日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
C++內(nèi)存管理的探討

下邊開始對(duì)C++內(nèi)存管理進(jìn)行探討:

創(chuàng)新互聯(lián)專注于東營(yíng)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供東營(yíng)營(yíng)銷型網(wǎng)站建設(shè),東營(yíng)網(wǎng)站制作、東營(yíng)網(wǎng)頁(yè)設(shè)計(jì)、東營(yíng)網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)服務(wù),打造東營(yíng)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供東營(yíng)網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

  先看一段程序:

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

  不用編譯器,大家想想執(zhí)行過(guò)之后應(yīng)該打印什么結(jié)果?我想大家的***反應(yīng)應(yīng)該是打印出一個(gè)不確定的數(shù)。理由是在if語(yǔ)句里,我們定義了k這個(gè)變量,在if執(zhí)行結(jié)束之后,這個(gè)變量k所占據(jù)的內(nèi)存是被系統(tǒng)收回的,于是也就造成了變量j所指的結(jié)果非常不確定。當(dāng)然,如果編譯并且執(zhí)行過(guò)后,我們發(fā)現(xiàn)事情并不是像我們想象的那樣,程序最終的打印結(jié)果是20,并不是我們期待的一個(gè)不確定的數(shù)。下面就讓我們分析一下原因吧!

  我們用debug的方式來(lái)一步一步的分析,在watch的窗口下輸入里面所有的變量。

 
 
 
 
  1. int i=10;  //i is 10 and &i is 0x0012ff7c 
  2. int *j=&i; //*j is 10 and &j is 0x0012ff7c 
  3.       //顯然可以看出此時(shí)兩個(gè)變量指的是同一地址 
  4. if(!0)
  5. {
  6.   int l=20; //l is 20 and &l is 0x0012ff74 
  7.   /*地址0x0012ff7c—0x0012ff75被占據(jù)。要說(shuō)明的是,
  8.   這個(gè)數(shù)值很有可能因?yàn)殡娔X硬件的不同而不同。*/ 
  9.   int *k=&l; //*k is 20 and &k is 0x0012ff74 
  10.   //變量k與l指向同一地址。 
  11.   j=k;  //j is 0x0012ff74 and *j is 20
  12.   /*指針間的賦值,這個(gè)語(yǔ)句的意思是把k指向的地址負(fù)值給j。
  13.   此時(shí)這兩個(gè)變量指向的是同一個(gè)地址,都是0x0012ff74,而那
  14.   塊地址存放的是20,所以也就有*j是20的原因。*/ 
  15. }
  16. cout<<*j; //*j is 20 and j is 0x0012ff74 
  17. /*此時(shí)同時(shí)可以看到k的地址是0x00000000,說(shuō)明k這個(gè)變量
  18. 已經(jīng)被自動(dòng)銷毀,所以地址指零。但是j所指的并不是k,而
  19. 是k所指的那段地址0x0012ff74,而由于此時(shí)j的生存周期還
  20. 沒(méi)有結(jié)束(j是在if意外定義的),所以j指向的這塊地址并
  21. 沒(méi)有被收回,也就保存下來(lái)20這個(gè)數(shù)了。*/

  至此,我們分析完了程序的全過(guò)程的內(nèi)存分配情況,最終結(jié)果如下圖所示:

  我們同時(shí)也可以在Memory里面看看這個(gè)地址的具體內(nèi)容。我們可以看到是14,這是十六進(jìn)制的數(shù),化成十進(jìn)制,正好是20。如下圖所示:

  現(xiàn)在大家應(yīng)該對(duì)上面那個(gè)程序的執(zhí)行過(guò)程有一個(gè)大概地了解了吧!不過(guò)這個(gè)還不是我們想要得到的結(jié)果,我們需要的是打印一個(gè)不確定的結(jié)果。有了以上的分析,我們開始新的程序,讓他打印出我們想要的東西。

#p#

  對(duì)于上面的程序,我們需要改動(dòng)的是令變量j指向一個(gè)地址被釋放的位置。于是就有了下面的程序:

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

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

  執(zhí)行的結(jié)果,在debug下,是20;在release下,結(jié)果是4198795。顯然那部分內(nèi)存被釋放掉了。這是因?yàn)樵赿ebug的程序里面,執(zhí)行完函數(shù)foo,并沒(méi)有立即釋放掉l的那個(gè)地址(目前我不清楚這句話說(shuō)得是否精確)。在這個(gè)程序的release版本中,顯然程序釋放了那部分的地址,所以指向了一個(gè)不確定的數(shù)。

  這里還要說(shuō)一件事情,就是在***個(gè)程序當(dāng)中,無(wú)論是debug版本還是release版本。執(zhí)行完那個(gè)if語(yǔ)句以后,系統(tǒng)都是不會(huì)真正的把l清除掉,l只是k的一個(gè)別名。上面的程序是這樣寫的,用了*j=&i這樣一句負(fù)值語(yǔ)句,而別名在MSDN中的解釋與引用是相同的,所以也可以這樣理解,int i=10; int &j=i;與上面的相同。不要去想上面這些程序了,大家再看看下面這個(gè)。

 
 
 
 
  1. void f1( int *& j)
  2.   int l=20; 
  3.   int *k=&l; 
  4.   j=k; 
  5.   k=0; 
  6. }
  7. void any_function_use_local_variables()
  8. {
  9.   int a,b,c; 
  10.   a=b=c=100; 
  11. }
  12. int main()
  13.   int i=10; 
  14.   int *j=&i; 
  15.   f1(j); 
  16.   cout<<*j; 
  17.   any_function_use_local_variables(); 
  18.   cout<<*j; 
  19.   return 0;
  20. }

  請(qǐng)大家自己編譯、執(zhí)行,看看結(jié)果是什么,然后結(jié)合上面的兩個(gè)例子,想想是為什么。下面再給大家一個(gè)小例子,可能會(huì)有助于理解內(nèi)存的概念。

  程序的過(guò)程是試圖去增加i,使之超過(guò)***的整數(shù)。有一種情況是這個(gè)值被“卷回來(lái)”變成一個(gè)負(fù)數(shù),在我的機(jī)器上程序的打印結(jié)果是-2147483648,這個(gè)結(jié)果可能因?yàn)橛布牟煌煌?/p>

 
 
 
 
  1. int main()
  2.   int i=1; 
  3.   while(0
  4.   cout<
  5.   return 0;

當(dāng)前標(biāo)題:C++內(nèi)存管理的探討
轉(zhuǎn)載來(lái)于:http://www.5511xx.com/article/cophihg.html