亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 教學--第二十章 指針 二 為指針分配和釋放空間.htm

?? 《白話c++網(wǎng)頁版》是一本用淺顯易懂的并具有點幽默的語調(diào)來講述c++的高深的內(nèi)容
?? HTM
?? 第 1 頁 / 共 5 頁
字號:
      <P> </P>
      <P>關于指針本身的<SPAN lang=en-us> </SPAN>+ 和 - 操作,請復習上一章相關內(nèi)容。</P>
      <P> </P>
      <P>接下來的問題也很重要。</P>
      <P> </P>
      <H3><B><A name=20.4>20.4</A><SPAN lang=zh-cn> </SPAN>delete/delete[] <SPAN 
      lang=zh-cn>的兩個注意點</SPAN></B></H3>
      <P><SPAN lang=zh-cn>指針通過</SPAN> new <SPAN lang=zh-cn>或</SPAN> new[] <SPAN 
      lang=zh-cn>,向系統(tǒng)“申請”得到一段內(nèi)存空間,我們說過,這段內(nèi)存空間必須在不需要將它釋放了。有點像人類社會的終極目標“共產(chǎn)主義”下的“按需分配”。需要了就申請,不需要了,則主動歸還。</SPAN></P>
      <P> </P>
      <P><SPAN 
      lang=zh-cn>現(xiàn)在問題就在于這個“主動歸還”。當然,指針并不存在什么思想覺悟方面的問題,說光想申請不想歸還。真正的問題是,指針在某些方面的表現(xiàn)似乎有些像“花心大蘿卜”。請看下面代碼,演示令人心酸的一幕。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>/*</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp; 初始化 p</SPAN>&nbsp; ----- p <SPAN 
      lang=zh-cn>的新婚</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp; 通過</SPAN> new <SPAN 
      lang=zh-cn>,將一段新建的內(nèi)存“嫁給”指針p</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp; 這一段分配的內(nèi)存,就是p的原配夫妻</SPAN></P>
      <P>*/</P>
      <P><B>int* p = new int[100];&nbsp; </B></P>
      <P> </P>
      <P> </P>
      <P>/<SPAN lang=zh-cn>*</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; 使用 p&nbsp; ----- 恩愛相處</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; N 多年恩愛相處,此處略去不表</SPAN></P>
      <P>*/</P>
      <P><SPAN lang=zh-cn>……</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>/</SPAN>*</P>
      <P>&nbsp;&nbsp; p <SPAN lang=zh-cn>改變指向</SPAN> ---- <SPAN 
      lang=zh-cn>分手</SPAN></P>
      <P>*/</P>
      <P> </P>
      <P><B>int girl [100];&nbsp;&nbsp; //<SPAN lang=zh-cn>第三者出現(xiàn)</SPAN></B></P>
      <P><B>p = girl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //p <SPAN 
      lang=zh-cn>就這樣指向 </SPAN>girl</B></P>
      <P> </P>
      <P> </P>
      <P>/*</P>
      <P>&nbsp;&nbsp; delete [] p ---- <SPAN 
      lang=zh-cn>&nbsp;落幕前的災難</SPAN>&nbsp; </P>
      <P> </P>
      <P>&nbsp;&nbsp; <SPAN lang=zh-cn>終于有一天,p老了,上帝選擇在這一時刻</SPAN></P>
      <P><SPAN lang=zh-cn>&nbsp;&nbsp; 懲罰他</SPAN></P>
      <P>*/</P>
      <P> </P>
      <P><B>delete [] p;</B></P>
      <P> </P>
      <P><SPAN 
      lang=zh-cn>扣除注釋,上面只有4行代碼。這4行代碼完全符合程序世界的憲法:語法。也就是說對它們進行編譯,編譯器會認為它們毫無錯誤,輕松放行。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>但在災難在</SPAN> delete [] p <SPAN 
      lang=zh-cn>時發(fā)生。</SPAN></P>
      <P><SPAN lang=zh-cn>我們原意是要釋放 p 最初通過 </SPAN>new int[100]<SPAN 
      lang=zh-cn>而得到的內(nèi)存空間,但事實上,p那時已經(jīng)指向</SPAN>girl[100]<SPAN 
      lang=zh-cn>了。結(jié)果,第一、最初的空間并沒有被釋放。第二、</SPAN>girl[100]<SPAN lang=zh-cn> 
      本由系統(tǒng)自行釋放,現(xiàn)在我們卻要強行釋放它。</SPAN></P>
      <P> </P>
      <H4><A name=20.4.1>20.4.1</A> <B><SPAN 
      lang=zh-cn>一個指針被刪除時,應指向最初的地址</SPAN></B></H4>
      <P> </P>
      <P>當一個指針通過<SPAN lang=en-us> +,-</SPAN> 等操作而改變了指向;那么在釋放之前,應確保其回到原來的指向。</P>
      <P> </P>
      <P>比如:</P>
      <P> </P>
      <P><SPAN lang=en-us>int* p = new int[3];</SPAN></P>
      <P> </P>
      <P><SPAN lang=en-us>*p = 1;</SPAN></P>
      <P><SPAN lang=en-us>cout &lt;&lt; *p &lt;&lt; endl;</SPAN></P>
      <P> </P>
      <P><SPAN lang=en-us>p++;&nbsp;&nbsp;&nbsp; //p</SPAN>的指向改變了,指向了下一元素</P>
      <P><SPAN lang=en-us>*p = 2;</SPAN></P>
      <P><SPAN lang=en-us>cout &lt;&lt; *p &lt;&lt; endl;</SPAN></P>
      <P> </P>
      <P><SPAN lang=en-us>//</SPAN>錯誤的釋放:</P>
      <P><SPAN lang=en-us>delete [] p;</SPAN></P>
      <P> </P>
      <P>在<SPAN lang=en-us> delete [] p 
      </SPAN>時,p指向的是第二個元素,結(jié)果該釋放將產(chǎn)生錯位:第一個元素沒有被釋放,而在最后多刪除了一個元素。相當你蓋房時蓋的是前3間,可以在拆房時,漏了頭一間,從第二間開始拆起,結(jié)果把不是你蓋的第4房間倒給一并拆了。</P>
      <P> </P>
      <P>如何消除這一嚴重錯誤呢?</P>
      <P>第一種方法是把指針正確地<SPAN lang=en-us>"</SPAN>倒<SPAN 
      lang=en-us>"</SPAN>回原始位置:</P>
      <P> </P>
      <P><B><SPAN lang=en-us>p--;</SPAN></B></P>
      <P><SPAN lang=en-us>delete [] p;</SPAN></P>
      <P> </P>
      <P>但當我們的指針指向變化很多次時,在釋放前要保證一步不錯地一一退回,會比較困難。所以另一方法是在最初時“備份”一份。在釋放時,直接釋放該指針即可。</P>
      <P> </P>
      <P><SPAN lang=en-us>int* p = new int[3];</SPAN></P>
      <P><B><SPAN lang=en-us>int* pbak = *p;&nbsp;&nbsp;&nbsp; 
      //</SPAN>備份</B></P>
      <P> </P>
      <P>//移動<SPAN lang=en-us> p</SPAN></P>
      <P>……</P>
      <P> </P>
      <P><SPAN lang=en-us>//</SPAN>釋放:</P>
      <P><B><SPAN lang=en-us>delete [] pbak; </SPAN></B></P>
      <P> </P>
      <P>由于<SPAN lang=en-us>pba</SPAN>k正是指向p最初分配后的地址,我們刪除<SPAN 
      lang=en-us>pbak,</SPAN><SPAN 
      lang=zh-cn>就是刪除p最初的指向。此時我們不能再刪除一次p。這也就引出</SPAN>new / delete <SPAN 
      lang=zh-cn>及</SPAN> new[] / delete[] <SPAN 
      lang=zh-cn>在本章的最后一個問題。</SPAN></P>
      <P> </P>
      <H4><B><A name=20.4.2>20.4.2</A> <SPAN 
      lang=zh-cn>已釋放的空間,不可重復釋放</SPAN></B></H4>
      <P> </P>
      <P><SPAN lang=zh-cn>第一種情況,錯了最直接:</SPAN></P>
      <P> </P>
      <P>int* p = new int(71);</P>
      <P>cout &lt;&lt; *p &lt;&lt; endl;</P>
      <P> </P>
      <P>delete p; //OK!</P>
      <P>delete p; <FONT color=#ff0000>//ERROR! <SPAN 
      lang=zh-cn>重復刪除p</SPAN></FONT></P>
      <P> </P>
      <P><SPAN lang=zh-cn>當然,如果同一指針在</SPAN>delete<SPAN 
      lang=zh-cn>之后,又通過</SPAN>new <SPAN lang=zh-cn>或</SPAN> new[] <SPAN 
      lang=zh-cn>分配了一次內(nèi)存,則需要再刪除一次:</SPAN></P>
      <P> </P>
      <P>int* p = new int(71);</P>
      <P>cout &lt;&lt; *p &lt;&lt; endl;</P>
      <P> </P>
      <P>delete p; //OK!</P>
      <P>...</P>
      <P>p = new int(81);</P>
      <P>delete p; //OK!</P>
      <P>...</P>
      <P> </P>
      <P>p = new int[10];</P>
      <P>for (int i=0; i&lt;10; i++)</P>
      <P>&nbsp; *p = i;</P>
      <P> </P>
      <P>...</P>
      <P>delete [] p; //OK!</P>
      <P> </P>
      <P><SPAN lang=zh-cn>上面代碼中,共計三次對p進行</SPAN>delete <SPAN lang=zh-cn>或</SPAN> 
      delete[]<SPAN lang=zh-cn>,但不屬于重復刪除。因為每次</SPAN>delete<SPAN 
      lang=zh-cn>都對應一次新的</SPAN>new<SPAN lang=zh-cn>。</SPAN></P>
      <P><SPAN lang=zh-cn>我們下面所說的例子,均指一次</SPAN>delete<SPAN 
      lang=zh-cn>之后,沒有再次</SPAN>new<SPAN lang=zh-cn>,而重復進行</SPAN>delete<SPAN 
      lang=zh-cn>。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>第二種情況,重復刪除同一指向的多個指針</SPAN></P>
      <P> </P>
      <P>int* p1 = new int(71);</P>
      <P>int* p2 = p1;&nbsp;&nbsp; //<SPAN lang=zh-cn>p2和p1 
現(xiàn)在指向同一內(nèi)存地址</SPAN></P>
      <P> </P>
      <P>cout &lt;&lt; *p1 &lt;&lt; endl;</P>
      <P>cout &lt;&lt; *p2 &lt;&lt; endl;</P>
      <P> </P>
      <P>delete p1;&nbsp; //OK</P>
      <P>delete p2;&nbsp; <FONT color=#ff0000>//ERROR! <SPAN 
      lang=zh-cn>p2所指的內(nèi)存,已通過</SPAN>delete <SPAN 
      lang=zh-cn>p1而被釋放,不可再</SPAN>delete<SPAN lang=zh-cn>一次。</SPAN></FONT></P>
      <P> </P>
      <P><SPAN lang=zh-cn>同樣的問題,如果你先刪除了</SPAN>p2<SPAN 
      lang=zh-cn>,則同樣不可再刪除p1。</SPAN></P>
      <P> </P>
      <P>...</P>
      <P>delete p2; //OK</P>
      <P>delete p1; <FONT color=#ff0000>//ERROR</FONT></P>
      <P> </P>
      <P><SPAN lang=zh-cn>第三種情況,刪除指向某一普通變量的指針</SPAN></P>
      <P> </P>
      <P>int a = 100;</P>
      <P>int* p = &amp;a;</P>
      <P>delete p;&nbsp; //ERROR </P>
      <P> </P>
      <P>p <SPAN lang=zh-cn>不是通過</SPAN>new <SPAN 
      lang=zh-cn>得到新的內(nèi)存空間,而是直接指向固定變量:a。所以刪除</SPAN>p<SPAN 
      lang=zh-cn>等同要強行剝奪a的固有空間</SPAN>,<SPAN lang=zh-cn>會導致出錯。</SPAN></P>
      <P> </P>
      <H3><B><A name=20.5>20.5</A> C <SPAN lang=zh-cn>方式的內(nèi)存管理</SPAN></B></H3>
      <P> </P>
      <P>new/delete<SPAN 
      lang=zh-cn>只在C++里得到支持。在C里,內(nèi)存管理是通過專門的函數(shù)來實現(xiàn)。另外,為了兼容各種編程語言,操作系統(tǒng)提供的接口通常是 C 
      語言寫成的函數(shù)聲明 (</SPAN>Windows <SPAN 
      lang=zh-cn>本身也由C和匯編語言寫成)。這樣,我們就不得不同時學習C的內(nèi)存管理函數(shù)。</SPAN></P>
      <P> </P>
      <H4><B><A name=20.5.1>20.5.1</A> <SPAN lang=zh-cn>分配內(nèi)存</SPAN> malloc<SPAN 
      lang=zh-cn> 函數(shù)</SPAN></B></H4>
      <P> </P>
      <P><SPAN lang=zh-cn>需要包含頭文件:</SPAN></P>
      <P>#include &lt;alloc.h&gt;</P>
      <P><SPAN lang=zh-cn>或</SPAN></P>
      <P>#include &lt;stdlib.h&gt;</P>
      <P> </P>
      <P><SPAN lang=zh-cn>函數(shù)聲明</SPAN>(<SPAN lang=zh-cn>函數(shù)原型</SPAN>)<SPAN 
      lang=zh-cn>:</SPAN></P>
      <P>void *malloc(int size);</P>
      <P> </P>
      <P><SPAN lang=zh-cn>說明:</SPAN>malloc <SPAN 
      lang=zh-cn>向系統(tǒng)申請分配指定</SPAN>size<SPAN lang=zh-cn>個字節(jié)的內(nèi)存空間。返回類型是</SPAN> 
      void* <SPAN lang=zh-cn>類型。</SPAN>void* <SPAN 
      lang=zh-cn>表示未確定類型的指針。C,C++規(guī)定,</SPAN>void* <SPAN 
      lang=zh-cn>類型可以強制轉(zhuǎn)換為任何其它類型的指針。</SPAN></P>
      <P> </P>
      <P><SPAN lang=zh-cn>從函數(shù)聲明上可以看出。</SPAN>malloc <SPAN lang=zh-cn>和</SPAN> new 
      <SPAN lang=zh-cn>至少有兩個不同</SPAN>:<SPAN lang=zh-cn> </SPAN>new<SPAN 
      lang=zh-cn> 返回指定類型的指針,并且可以自動計算所需要大小。比如:</SPAN></P>
      <P> </P>
      <P>int *p;</P>
      <P> </P>
      <P>p = new int; //<SPAN lang=zh-cn>返回類型為</SPAN>int* <SPAN 
      lang=zh-cn>類型</SPAN>(<SPAN lang=zh-cn>整數(shù)型指針</SPAN>)<SPAN 
      lang=zh-cn>,分配大小為</SPAN> sizeof(int);</P>
      <P><SPAN lang=zh-cn>或:</SPAN></P>
      <P> </P>
      <P>int* parr;</P>
      <P> </P>
      <P>parr = new int [100];&nbsp; //<SPAN lang=zh-cn>返回類型為</SPAN> int* <SPAN 
      lang=zh-cn>類型</SPAN>(<SPAN lang=zh-cn>整數(shù)型指針</SPAN>)<SPAN 
      lang=zh-cn>,分配大小為</SPAN> sizeof(int) * 100;</P>
      <P> </P>
      <P><SPAN lang=zh-cn>而</SPAN> malloc <SPAN 
      lang=zh-cn>則必須由我們計算要字節(jié)數(shù),并且在返回后強行轉(zhuǎn)換為實際類型的指針。</SPAN></P>
      <P> </P>
      <P>int* p;</P>
      <P> </P>
      <P>p = <B>(int *)</B>&nbsp; malloc (<B>sizeof(int)</B>);</P>
      <P> </P>
      <P><SPAN lang=zh-cn>第一、</SPAN>malloc <SPAN lang=zh-cn>函數(shù)返回的是</SPAN> void 
      *<SPAN lang=zh-cn> 類型,如果你寫成:</SPAN>p = malloc (sizeof(int)); <SPAN 
      lang=zh-cn>則程序無法通過編譯,報錯:“不能將</SPAN> void* <SPAN lang=zh-cn>賦值給</SPAN> int 
      *<SPAN lang=zh-cn> 類型變量”。所以必須通過</SPAN> <B>(int *)<SPAN lang=zh-cn> 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91免费观看在线| 久久综合久色欧美综合狠狠| 国产欧美日产一区| 看国产成人h片视频| 欧美日韩激情一区二区三区| 亚洲线精品一区二区三区八戒| 一本色道久久综合亚洲aⅴ蜜桃| 日韩一区日韩二区| 91免费版在线看| 亚洲激情第一区| 欧美日韩亚洲国产综合| 午夜国产精品一区| 8x8x8国产精品| 麻豆精品一区二区| 中文字幕av不卡| 欧美性受xxxx黑人xyx性爽| 欧美aaaaa成人免费观看视频| 久久天天做天天爱综合色| 不卡的av电影在线观看| 亚洲午夜免费视频| 欧美本精品男人aⅴ天堂| 成人一区在线看| 亚洲成人动漫在线观看| 亚洲精品一区二区三区蜜桃下载| 国产亚洲精品资源在线26u| www..com久久爱| 亚洲成av人在线观看| 久久亚洲免费视频| 91美女精品福利| 青青草精品视频| 中文字幕va一区二区三区| 欧美日韩aaa| 国产一区二区三区精品视频| 亚洲精品免费一二三区| 精品欧美乱码久久久久久1区2区| jlzzjlzz亚洲日本少妇| 日韩在线卡一卡二| 国产女同互慰高潮91漫画| 精品视频在线看| 国产激情视频一区二区在线观看 | 2022国产精品视频| 91蜜桃免费观看视频| 日本欧美在线观看| 亚洲欧洲精品一区二区精品久久久| 欧美性受xxxx黑人xyx性爽| 国产一区二区精品在线观看| 亚洲一区视频在线| 久久久av毛片精品| 欧美午夜电影一区| 高清在线不卡av| 五月天久久比比资源色| 国产精品日产欧美久久久久| 91精品久久久久久久91蜜桃| 91美女在线视频| 国产精品亚洲综合一区在线观看| 亚洲午夜久久久久久久久电影网| 国产欧美一区二区精品久导航| 欧美日韩国产一级| 不卡电影一区二区三区| 看电视剧不卡顿的网站| 亚洲韩国一区二区三区| 国产精品卡一卡二卡三| 精品久久久久久久久久久院品网 | 久久亚洲精华国产精华液 | 国产精品白丝在线| 精品久久久三级丝袜| 欧美日韩在线三区| 成人av动漫网站| 久久99精品国产麻豆婷婷洗澡| 亚洲综合图片区| 国产精品伦理一区二区| 久久综合丝袜日本网| 欧美一区二区在线免费播放| 在线精品视频免费播放| 成人avav影音| 国产麻豆视频一区| 老鸭窝一区二区久久精品| 偷窥少妇高潮呻吟av久久免费| 亚洲精选免费视频| 中文字幕中文在线不卡住| 国产亚洲一区二区三区| 欧美成人福利视频| 欧美精品乱码久久久久久 | 欧美精品一区二区精品网| 欧美丰满少妇xxxxx高潮对白| 一本到不卡免费一区二区| 成人动漫视频在线| 丰满放荡岳乱妇91ww| 国产麻豆视频精品| 国产一区免费电影| 久草在线在线精品观看| 久久精品国产秦先生| 日本伊人色综合网| 亚洲电影视频在线| 亚洲一级二级在线| 亚洲综合在线电影| 亚洲美女屁股眼交| 亚洲女同ⅹxx女同tv| 18欧美乱大交hd1984| ...av二区三区久久精品| 国产精品久久久久影院亚瑟| 国产三级精品在线| 久久久99精品久久| 久久久久久亚洲综合影院红桃| 亚洲精品一区二区三区蜜桃下载 | 欧美一区二区三区免费| 在线电影国产精品| 欧美一区二区在线视频| 日韩欧美色综合| 精品99999| 久久噜噜亚洲综合| 久久久久久久久岛国免费| 国产偷v国产偷v亚洲高清| 国产欧美日韩中文久久| 国产精品视频免费看| 成人免费一区二区三区在线观看| 亚洲欧美乱综合| 亚洲综合另类小说| 亚洲风情在线资源站| 天天做天天摸天天爽国产一区 | 欧美特级限制片免费在线观看| 色视频一区二区| 欧美色图天堂网| 欧美美女黄视频| 日韩一级大片在线| 欧美电视剧免费观看| 久久午夜色播影院免费高清| 欧美国产精品v| 亚洲视频每日更新| 亚洲123区在线观看| 麻豆精品久久久| 国产乱人伦精品一区二区在线观看 | 免费不卡在线观看| 国产精品中文欧美| 99精品国产99久久久久久白柏| 一本久久综合亚洲鲁鲁五月天| 欧美色网站导航| 精品国产一区a| 国产精品久久久久久亚洲伦 | 亚洲欧美日韩国产综合| 亚洲va欧美va人人爽午夜| 久久精品国内一区二区三区| 国产a精品视频| 在线精品视频小说1| 日韩欧美一区在线| 欧美国产日韩精品免费观看| 一区二区三区在线免费观看| 人禽交欧美网站| 成人小视频在线观看| 在线看日本不卡| 精品国产乱码久久久久久1区2区| 国产精品久久久久毛片软件| 午夜精品免费在线观看| 国产一区不卡在线| 色综合久久综合| 欧美成人一区二区三区| 亚洲图片另类小说| 人禽交欧美网站| av成人免费在线观看| 欧美精选一区二区| 国产丝袜在线精品| 亚洲一级在线观看| 国产精品羞羞答答xxdd| 在线观看网站黄不卡| 欧美岛国在线观看| 亚洲蜜臀av乱码久久精品蜜桃| 麻豆精品一二三| 99视频一区二区| 欧美一区二区久久| 国产精品麻豆视频| 蜜桃av一区二区| 91蝌蚪国产九色| 日韩亚洲欧美高清| 亚洲女人的天堂| 国产精品1区2区3区在线观看| 欧美日韩视频在线第一区| 国产午夜亚洲精品不卡| 性久久久久久久| 成人黄色电影在线| 日韩精品一区二区三区三区免费| 亚洲日本电影在线| 国模娜娜一区二区三区| 欧美视频三区在线播放| 国产欧美日本一区二区三区| 日韩国产欧美在线视频| 91麻豆精品视频| www激情久久| 香蕉av福利精品导航| 粉嫩av一区二区三区| 日韩一级片在线观看| 亚洲影视在线观看| www.亚洲精品| 久久这里只精品最新地址| 日日骚欧美日韩| 91成人免费在线| 国产精品电影院| 国产一本一道久久香蕉| 日韩一区二区三区视频| 一区二区三区日韩在线观看| 丁香婷婷综合五月|