成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++內存管理的探討

開發 后端
大家都知道變量的生存周期這個概念,可是有的時候變量生存周期已經結束,但是所分配的那塊內存空間還是存在的。文章舉了四個不同的例子,來對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。如下圖所示:

 

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

#p#

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

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

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

  執行的結果,在debug下,是20;在release下,結果是4198795。顯然那部分內存被釋放掉了。這是因為在debug的程序里面,執行完函數foo,并沒有立即釋放掉l的那個地址(目前我不清楚這句話說得是否精確)。在這個程序的release版本中,顯然程序釋放了那部分的地址,所以指向了一個不確定的數。

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

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

  請大家自己編譯、執行,看看結果是什么,然后結合上面的兩個例子,想想是為什么。下面再給大家一個小例子,可能會有助于理解內存的概念。

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

  1. int main()  
  2. {   
  3.   int i=1;   
  4.   while(0<i) i++;   
  5.   cout<<i;   
  6.   return 0;  
  7. }  

【編輯推薦】

  1. 內存管理內幕
  2. c++編程常用工具
  3. C++內存管理不同方式分析
  4. 2.2.3 抽象和內存管理
  5. 程序員必看 c++筆試題匯總
責任編輯:韓亞珊 來源: 天極網
相關推薦

2010-02-03 10:50:33

C++多態

2011-07-01 10:16:08

C++內存管理

2023-12-12 13:13:00

內存C++編程語言

2024-12-31 00:00:15

2009-09-04 15:53:42

C#內存流

2010-02-04 15:41:10

C++內存管理

2010-01-27 16:10:32

C++靜態構造函數

2010-02-04 13:39:44

C++數組參數

2010-02-06 17:09:29

C++文件拷貝

2010-02-03 10:11:17

C++動態數組

2024-01-22 11:33:17

C++編程語言開發

2010-02-03 16:29:19

C++ sizeof

2010-02-04 11:15:28

C++模板限制

2024-12-26 10:45:08

2023-12-31 12:56:02

C++內存編程

2010-01-08 16:52:57

C++和C#

2020-11-04 08:37:37

C語言C++內存

2011-06-16 09:28:02

C++內存泄漏

2023-11-17 11:40:51

C++內存

2009-09-01 15:24:59

C++、C#和JAVA
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区在线 | 国产特一级黄色片 | av男人的天堂在线 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 亚洲精品免费在线观看 | 精品久久久久久久久久 | 视频一区在线观看 | 精品乱码一区二区三四区 | 日韩一区二区三区四区五区六区 | 最新午夜综合福利视频 | 精品一区精品二区 | 久久精品久久综合 | 亚洲免费久久久 | 日韩中文字幕一区 | 国产在线成人 | 三区在线观看 | 欧美另类视频在线 | 亚洲国产精品99久久久久久久久 | 精品一区二区三区不卡 | 欧美日韩国产精品一区二区 | 午夜精品一区二区三区免费视频 | 欧美精品一区二区三区在线播放 | 欧美性生活网 | 91精品国产综合久久婷婷香蕉 | 很很干很很日 | 亚洲福利av | 亚洲一区久久 | 欧美午夜精品理论片a级按摩 | 国产视频二区 | 久久久一区二区三区 | 夜夜夜久久 | 日本精品一区二区三区在线观看视频 | 中文字幕在线视频精品 | 九热在线 | 国产精品一区二区在线 | 日韩免费一区 | 成人依人 | 亚洲影视在线 | 99精品久久| 欧美一区二区三区视频 | 中文字幕久久久 |