亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

淺談C++中的內存管理

2019-11-17 05:05:40
字體:
來源:轉載
供稿:網友

  摘要:

  大家都知道變量的生存周期這個概念,可是有的時候變量生存周期已經結束,但是所分配的那塊內存空間還是存在的。文章舉了四個不同的例子,來說明這其中的原因。   前言:

  前一段時間在一個好友的的博客論壇上看到他學習C++時碰到的一小點問題,是關于C++中最基本的內存分配方面的。其實對于內存這東西,除了知道我自己用的是256M的內存以外,我也不太清楚他到底里面是怎么工作的??戳舜髱焸兊闹v解,我深有體會,把這些講解整理出來,為所有C++的newbie們共勉!  正文:  事情是因為這樣一小段程序而來的。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這個數了。*/  至此,我們分析完了程序的全過程的內存分配情況,最終結果是這樣的。(圖1)淺談C++中的內存治理

  我們同時也可以在Memory里面看看這個地址的具體內容。我們可以看到是14,這是十六進制的數,化成十進制,正好是20。(圖2)淺談C++中的內存治理

  現在大家應該對上面那個程序的執行過程有一個大概地了解了吧!不過這個還不是我們想要得到的結果,我們需要的是打印一個不確定的結果。有了以上的分析,我們開始新的程序,讓他打印出我們想要的東西?! τ谏厦娴某绦?,我們需要改動的是令變量j指向一個地址被釋放的位置。于是就有了下面的程序。int * foo()
{
  int l=20;
  return &l;
}int main()
{
  int i=10;
  int *j=&i;
  j = foo();
  cout<<*j;
  return 0;
}  編譯器很“聰明”,編譯后會給出一個警告。原話是“returning address of local variable or temporary”,指向的是上面程序的第四行,也就是return &l;這條語句。那句英文的意思也不用我再多解釋了,相信大家都能看得明白。  執行的結果,在debug下,是20;在release下,結果是4198795。顯然那部分內存被釋放掉了。這是因為在debug的程序里面,執行完函數foo,并沒有立即釋放掉l的那個地址(目前我不清楚這句話說得是否精確)。在這個程序的release版本中,顯然程序釋放了那部分的地址,所以指向了一個不確定的數。 更多文章 更多內容請看C/C++技術專題  揭秘linux內存治理  網絡治理實用手冊專題,或
這里還要說一件事情,就是在第一個程序當中,無論是debug版本還是release版本。執行完那個if語句以后,系統都是不會真正的把l清除掉,l只是k的一個別名。上面的程序是這樣寫的,用了*j=&i這樣一句負值語句,而別名在MSDN中的解釋與引用是相同的,所以也可以這樣理解,int i=10; int &j=i;與上面的相同。不要去想上面這些程序了,大家再看看下面這個。
void f1( int *& j)
{
  int l=20;
  int *k=&l;
  j=k;
  k=0;
}
void any_function_use_local_variables()
{
  int a,b,c;
  a=b=c=100;
}int main()
{
  int i=10;
  int *j=&i;
  f1(j);
  cout<<*j;
  any_function_use_local_variables();
  cout<<*j;
  return 0;
}  請大家自己編譯、執行,看看結果是什么,然后結合上面的兩個例子,想想是為什么。下面再給大家一個小例子,可能會有助于理解內存的概念?! 〕绦虻倪^程是試圖去增加i,使之超過最大的整數。有一種情況是這個值被“卷回來”變成一個負數,在我的機器上程序的打印結果是-2147483648,這個結果可能因為硬件的不同而不同。int main()
{
  int i=1;
  while(0<i) i++;
  cout<<i;
  return 0;
}   結束。 更多文章 更多內容請看C/C++技術專題  揭秘Linux內存治理  網絡治理實用手冊專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品一区二区三区久久| 欧美大全免费观看电视剧大泉洋| 自拍偷拍亚洲区| 亚洲免费精彩视频| 一本一道久久a久久精品逆3p| 欧美电影免费观看网站| 91成人在线观看国产| 久久成年人免费电影| 精品高清美女精品国产区| 热99精品只有里视频精品| 91tv亚洲精品香蕉国产一区7ujn| 日韩av中文字幕在线免费观看| 国产主播在线一区| 欧美日韩国产精品一区二区不卡中文| 91久久精品国产91久久性色| 国产精品久久久久久久久久小说| 精品亚洲国产成av人片传媒| 成人a视频在线观看| 欧美视频在线看| 色婷婷综合成人av| 亚洲精品中文字幕av| 日韩欧美成人免费视频| 亚洲国产一区自拍| 成人免费高清完整版在线观看| 中文字幕综合在线| 日韩va亚洲va欧洲va国产| 欧美人与性动交a欧美精品| 久久久久久久久久久91| 精品久久久91| 亚洲网址你懂得| 2020国产精品视频| 成人免费视频网址| 欧美成人精品不卡视频在线观看| 色狠狠久久aa北条麻妃| 91在线观看免费| 国产成人精品综合久久久| 国产成人综合av| 69av在线视频| 青青草精品毛片| 欧洲亚洲免费视频| 韩国日本不卡在线| 精品国产鲁一鲁一区二区张丽| 欧美精品videos| 国产女人18毛片水18精品| 国产精品一区二区久久精品| 日韩电影中文字幕在线观看| 国产有码在线一区二区视频| 成人免费自拍视频| 久久成人免费视频| 日本精品久久中文字幕佐佐木| 亚洲精品国产综合久久| 国产精品免费视频xxxx| 亚洲第一男人av| 成人国产精品色哟哟| 久久理论片午夜琪琪电影网| 亚洲国产精品一区二区久| 欧美在线欧美在线| 成人www视频在线观看| 亚洲欧美日韩国产中文专区| 亚洲人在线观看| 欧美电影电视剧在线观看| 九九热精品视频国产| 在线视频欧美日韩精品| 国产精品偷伦视频免费观看国产| 亚洲欧美国产另类| 久久久免费精品| 亚洲成人久久电影| 亚洲视频欧美视频| 久久精品美女视频网站| 国产精品丝袜久久久久久不卡| 97涩涩爰在线观看亚洲| 久久精品99无色码中文字幕| 欧美在线xxx| 一区二区亚洲精品国产| 国产视频欧美视频| 日本精品久久中文字幕佐佐木| 色阁综合伊人av| 欧美高清视频在线观看| 亚洲色图激情小说| 日韩中文在线视频| 一区二区三区视频观看| 91在线视频免费| 日韩欧美国产骚| 亚洲free性xxxx护士hd| 欧美精品九九久久| 色综合色综合久久综合频道88| 中文国产亚洲喷潮| 日韩中文字幕视频| 日本一区二三区好的精华液| 日韩激情片免费| 日韩欧美999| 日韩av大片在线| 欧美成人性生活| 亚洲欧美另类在线观看| 亚洲在线免费看| 国产精品视频区1| 97在线免费视频| 欧美午夜电影在线| 91系列在线播放| 国产亚洲欧美日韩精品| 国产午夜精品麻豆| 国产精品色婷婷视频| 亚洲欧洲视频在线| 亚洲国产精品美女| 欧美黑人巨大精品一区二区| 亚洲欧洲中文天堂| 美日韩精品免费视频| 久久影院资源站| 国产精品精品视频| 亚洲老司机av| 亚洲电影免费观看高清| 亚洲精品久久久久中文字幕二区| 亚洲国产精品久久精品怡红院| 91精品久久久久久久久久久| 欧美成人亚洲成人日韩成人| 欧美一区二区三区图| 亚洲综合国产精品| 国产在线播放不卡| 久久久精品一区二区三区| 91精品久久久久久久久久久久久久| 欧美巨猛xxxx猛交黑人97人| 欧美日韩一区二区免费在线观看| 欧美夜福利tv在线| 国产视频丨精品|在线观看| 久久好看免费视频| 国产999精品久久久影片官网| 人人澡人人澡人人看欧美| 国产日韩欧美在线观看| 91精品免费视频| 亚洲国产精久久久久久久| 日韩精品免费在线视频| 另类美女黄大片| 黑人狂躁日本妞一区二区三区| 久久亚洲国产成人| 亚洲成av人片在线观看香蕉| 欧美大片在线看免费观看| 欧美极品少妇与黑人| 欧美人成在线视频| 国产一区二区三区欧美| 亚洲成人aaa| 92福利视频午夜1000合集在线观看| 欧美制服第一页| 中文字幕欧美在线| 久久久免费高清电视剧观看| 欧美成人一区在线| 日韩久久午夜影院| 亚洲色图欧美制服丝袜另类第一页| 国产亚洲在线播放| 亚洲成人网久久久| 欧美成人一区二区三区电影| 国产成人精品av| 欧美在线视频免费播放| 精品欧美aⅴ在线网站| 日韩成人av网址| 欧美日韩另类在线| 久久精品国产精品亚洲| 成人免费视频网址| 日本视频久久久| 日韩性xxxx爱| 亚洲欧美国产精品| 久久免费视频网| 亚洲的天堂在线中文字幕| 日韩精品有码在线观看| 欧美激情国产高清|