?? 教學--第二十章 指針 二 為指針分配和釋放空間.htm
字號:
<P>“原有的變量”,可以比喻成指向一間原有的,并且有主的房間。而“新分配的內存空間”,則像是一個“臨時建筑物”。我們必須在不用它的時候,主動將它拆遷。拆遷的工作由<SPAN
lang=en-us>delete</SPAN>來完成。
<P>
<P>當指針變量通過<SPAN lang=en-us> new
</SPAN>,而得到一個內存地址后,我們就可以像以前的所說的,通過該指針,通過*號,而對該內存地址(一個無名的變量),進行操作。
<P>如:
<P><SPAN lang=en-us>int* p = new int;</SPAN>
<P><SPAN lang=en-us>*p = 100;</SPAN>
<P><SPAN lang=en-us>cout << *p << endl;</SPAN>
<P>
<P>屏幕將輸出100。
<P>
<H4><B><A name=20.2.2>20.2.2</A> 在<SPAN lang=en-us>new
</SPAN>時初始化內存的值</B></H4>
<P>
<P><SPAN lang=en-us>new </SPAN>也可以在申請內存空間時,直接設置該段內存里要放點什么<SPAN
lang=en-us>.</SPAN>
<P>
<P>語法:
<P>
<P>指針變量 <SPAN lang=en-us>= <B>new</B> </SPAN>數據類型<B><SPAN
lang=en-us>(</SPAN>初值</B><SPAN lang=en-us><B>)</B>;</SPAN>
<P>
<P>這樣,上例可以改為:
<P>
<P><SPAN lang=en-us>int* p = new int<B>(100)</B>;</SPAN>
<P><SPAN lang=en-us>cout << *p << endl;</SPAN>
<P>
<P><SPAN lang=zh-cn>如果你申請的是字符類型的空間</SPAN>,<SPAN
lang=zh-cn>并且想初始化為‘A':</SPAN>
<P>
<P>char* pchar = new char('A');
<P>
<H4><B><SPAN lang=en-us><A name=20.2.3>20.2.3</A> delete</SPAN></B></H4>
<P>
<P>語法:
<P><SPAN lang=en-us><B>delete</B> </SPAN>指針變量<SPAN lang=en-us>;</SPAN>
<P>
<P><SPAN lang=en-us>delete </SPAN>將釋放指定指針所指向的內存空間。
<P>
<P>舉例:
<P>
<P><SPAN lang=en-us>int* p;</SPAN>
<P><SPAN lang=en-us>p = new int;</SPAN>
<P>
<P><SPAN lang=en-us>*p = 100;</SPAN>
<P><SPAN lang=en-us>cout << *p << endl;</SPAN>
<P>
<P><SPAN lang=en-us>delete p;</SPAN>
<P>
<P><SPAN lang=en-us>system("PAUSE");</SPAN>
<P>
<P>注意,當一個指針接受<SPAN
lang=en-us>delete</SPAN>操作后,它就又成了一個“指向不明”的指針。盡管我們可以猜測它還是指向“原來的房子”,然而,事實上,那座“房子”已經被<SPAN
lang=en-us>delete</SPAN> “拆遷”掉了。
<P>
<H4><B><A name=20.2.4>20.2.4</A> 實驗: <SPAN lang=en-us>new </SPAN>和<SPAN
lang=en-us> delete</SPAN></B></H4>
<P>
<P>很簡單的例子。
<P>第一步:
<P>首先,在CB新建一個控制臺程序。然后把上一小節的代碼放到<SPAN lang=en-us>main()</SPAN>函數內。運行。結果如下:
<P align=center>
<P align=center><IMG height=34
src="教學--第二十章 指針 二 為指針分配和釋放空間.files/ls20.h1.gif" width=172 border=0>
<P align=center><SPAN lang=en-us>(new </SPAN>和<SPAN lang=en-us>
delete)</SPAN>
<P>
<P>按任意鍵退出后,保存工程<SPAN lang=en-us>(Ctrl + Shift + S)</SPAN>。
<P>
<P>第二步:
<P>接下來我們來觀察指針變量被<SPAN
lang=en-us>delete</SPAN>之后,所指向的內存會是什么。但,這是一件犯了C、C++編程大忌的事:訪問一個已經<SPAN
lang=en-us>delete</SPAN> 的指針的值。如果你最近運氣很差,你的CB可能會被強行退出。所以,你明白我們為什么要先存盤了,對不?
<P>
<P>在前面的代碼中,加入以下加粗加紅的一行<SPAN lang=en-us>(</SPAN>同時,你也應注意我的加的注釋<SPAN
lang=en-us>)</SPAN>:
<P>
<P><SPAN lang=en-us>int* p;</SPAN>
<P><SPAN lang=en-us>p = new int;</SPAN>
<P>
<P><SPAN lang=en-us>*p = 100;</SPAN>
<P><SPAN lang=en-us>cout << *p << endl;</SPAN>
<P>
<P><SPAN lang=en-us>delete p;
<B> //p</B></SPAN><B>所指向的內存空間已經被釋放</B>
<P>
<P><B><FONT color=#ff0000><SPAN lang=en-us>cout << *p <<
endl; </SPAN></FONT><SPAN lang=en-us>//</SPAN>我們故意去訪問此時p所指的內存</B>
<P>
<P><SPAN lang=en-us>system("PAUSE");</SPAN>
<P>
<P>運行結果:
<P>
<P align=center><IMG height=53
src="教學--第二十章 指針 二 為指針分配和釋放空間.files/ls20.h2.gif" width=173 border=0>
<P align=center>(訪問<SPAN lang=en-us>delete</SPAN>之后的指針)
<P>
<P>44<SPAN lang=en-us>244844</SPAN>??在你的機器可能不是這個數,但一定同樣是怪怪的值。<SPAN
lang=en-us> </SPAN>原來是好端端的100,現在卻成了44<SPAN
lang=en-us>244844</SPAN>。不要問我這是為什么?昨天來時,美眉還住在這里一座別致小閣樓里,今日故地重游,這里竟成廢墟一片,依稀只見破墻上尚有:<B>“拆!——城建局”</B>的字樣?!
<P>
<P><SPAN lang=en-us>new </SPAN>是管建房的,而 <SPAN
lang=en-us>delete</SPAN>就一個字:拆!
<P>
<P><SPAN lang=zh-cn>請大家自行在CB上完成本實驗。我沒有提供本題的實際工程。</SPAN>
<H4><B><SPAN lang=en-us><A name=20.2.5>20.2.5</A> new </SPAN>和<SPAN
lang=en-us> delete </SPAN>的關系</B></H4>
<P>
<P>如果只有“建房”而沒有“拆房”,那么程序就會占用內存越來越多。所以,當使用<SPAN lang=en-us>new
</SPAN>為某個指針分配出內存空間后,一定要記得在不需要再使用時,用<SPAN lang=en-us>delete
</SPAN>刪除。下面是一個例子。演示<SPAN lang=en-us>new </SPAN>和<SPAN lang=en-us> delete
</SPAN>的對應使用。
<P>
<P><SPAN lang=en-us>//</SPAN>建屋和入住:
<P><SPAN lang=en-us>1) int* p = new int(100);</SPAN>
<P>
<P><SPAN lang=en-us>//</SPAN>使用:
<P><SPAN lang=en-us>2) cout << *p << endl;</SPAN>
<P>
<P><SPAN lang=en-us>//</SPAN>拆:
<P><SPAN lang=en-us>3) delete p;</SPAN>
<P>
<P>看,第1句,申請了4字節的內存空間,同時存入值為100的整數。
<P>第2句,在屏幕上輸出入住者的值<SPAN lang=en-us> (100)</SPAN>。
<P>第3句,釋放內存(這4字節被系統收回準備做其它用途)。入住者呢?自然消失了。
<P>
<P>前面舉的例子都是在<SPAN lang=en-us> new </SPAN>一個<SPAN lang=en-us> int
</SPAN>類型,其它類型也一樣:
<P>
<P><SPAN lang=en-us>char* a = new char('A');</SPAN>
<P><SPAN lang=en-us>cout << *a << endl;</SPAN>
<P><SPAN lang=en-us>*a = 'B';</SPAN>
<P><SPAN lang=en-us>cout << *a << end;</SPAN>
<P><SPAN lang=en-us>delete a;</SPAN>
<P>
<P><SPAN lang=en-us>bool* b = new bool;</SPAN>
<P><SPAN lang=en-us>*b = true;</SPAN>
<P>
<P><SPAN lang=en-us>if (*b)</SPAN>
<P><SPAN lang=en-us> cout << "true" <<
endl;</SPAN>
<P><SPAN lang=en-us>else</SPAN>
<P><SPAN lang=en-us> cout << "fale" << endl;</SPAN>
<P>
<P>但是這些都是簡單數據類型,如果要分配數組一樣的連續空間,則需要使另一對武器。
<P>
<H3><B><A name=20.3><SPAN lang=en-us>20.3</SPAN></A><SPAN lang=zh-cn>
</SPAN><SPAN lang=en-us>new [] </SPAN>和<SPAN lang=en-us> delete
[]</SPAN></B></H3>
<P>
<P>new / delete <SPAN lang=zh-cn>用于分配和釋放單個變量的空間,而</SPAN> new [] / delete[]
<SPAN lang=zh-cn>則用于分配連續多個變量的存間。</SPAN>
<P>
<H4><B><A name=20.3.1>20.3.1</A> new[] / delete[] <SPAN
lang=zh-cn>基本用法</SPAN></B></H4>
<P>
<P><B>new [] 語法:</B>
<P>
<P>指針變量<SPAN lang=en-us> = <B>new</B> </SPAN>數據類型<B><SPAN
lang=en-us>[</SPAN>元素個數<SPAN lang=en-us>]</SPAN></B>
<P>
<P>語法實例:
<P>
<P><SPAN lang=en-us>int* p = new int[20];</SPAN>
<P>
<P>首先,你需要迅速回想一下,如果是<SPAN lang=en-us> int* p = new int(20);
</SPAN>那么該是什么作用?否則你很容易在事后把二者混了。
<P>
<P>實例中,用<SPAN lang=en-us> new </SPAN>申請分配了20個連續的整數所需的空間,即:<SPAN
lang=en-us>20 * sizeof(int) = 80</SPAN>個字節。
<P>圖示為:
<P align=center><IMG height=395
src="教學--第二十章 指針 二 為指針分配和釋放空間.files/ls20.h3.gif" width=421 border=0>
<P align=center><SPAN lang=en-us>(</SPAN>指針變量p指向一段連續的內存空間<SPAN
lang=en-us>)</SPAN>
<P>
<P><SPAN lang=en-us>new int </SPAN>只是分配了一個整數的內存空間,而<SPAN lang=en-us> new
int[N]</SPAN>卻分配了N個整數的連續空間。<SPAN lang=zh-cn>看來,</SPAN>new[] <SPAN
lang=zh-cn>比</SPAN> new <SPAN lang=zh-cn>“威力更猛”,所以,我們同樣得記得:用</SPAN> new []
<SPAN lang=zh-cn>分配出空間,當不在需要時,必須及時調用</SPAN> delete [] <SPAN
lang=zh-cn>來釋放。</SPAN>
<P>
<P><B>delete [] <SPAN lang=zh-cn>語法:</SPAN></B>
<P>
<P>delete [] <SPAN lang=zh-cn>指針變量</SPAN>;
<P>
<P><SPAN lang=zh-cn>如:</SPAN>
<P>
<P>//<SPAN lang=zh-cn>分配了可以存放1000個</SPAN>int<SPAN
lang=zh-cn>的連續內存空間:</SPAN>
<P>int* p = new int[1000];
<P>
<P><SPAN lang=zh-cn>//然后使用這些空間:</SPAN>
<P><SPAN lang=zh-cn>……</SPAN>
<P>
<P><SPAN lang=zh-cn>//最后不需要了,及時釋放:</SPAN>
<P><B>delete []</B> p;
<P>
<H4><B><A name=20.3.2>20.3.2</A> new []/ delete[] <SPAN
lang=zh-cn>示例</SPAN></B></H4>
<P>
<P><SPAN lang=zh-cn>在</SPAN> Windows XP <SPAN lang=zh-cn>、</SPAN>Windows
NT<SPAN lang=zh-cn> 或</SPAN> Windows 2000<SPAN lang=zh-cn>中,按</SPAN> Ctrl
+ Alt + Del (<SPAN lang=zh-cn>其它操作系統,如</SPAN>Windows98/Me<SPAN
lang=zh-cn>等千萬不要按些組合鍵,否則電腦將重啟</SPAN>)<SPAN lang=zh-cn>。可以調出 </SPAN>Windows
<SPAN
lang=zh-cn>任務管理器,其中要以看出當前粗略的的內存使用量。下面我們結合該工具,寫一個程序,先分配100M的內存,再釋放。</SPAN>
<P>
<P><SPAN lang=zh-cn>這是程序代碼的抓圖:</SPAN>
<P align=center><IMG height=298
src="教學--第二十章 指針 二 為指針分配和釋放空間.files/ls20.h11.gif" width=541 border=0>
<P>
<P><SPAN lang=zh-cn>各步運行結果: </SPAN>
<TABLE id=AutoNumber3 style="BORDER-COLLAPSE: collapse"
borderColor=#111111 cellSpacing=0 cellPadding=0 width="100%" border=1>
<TBODY>
<TR>
<TD width="60%"><SPAN lang=zh-cn>程序顯示</SPAN></TD>
<TD align=middle width="40%"><SPAN lang=zh-cn>任務管理器抓圖</SPAN></TD></TR>
<TR>
<TD width="60%">
<P align=center><SPAN lang=zh-cn>第一步:分配內存之前</SPAN>
<P align=center><IMG height=42
src="教學--第二十章 指針 二 為指針分配和釋放空間.files/ls20.h5.gif" width=353
align=middle border=0> </P></TD>
<TD align=middle width="40%"><IMG height=65
src="教學--第二十章 指針 二 為指針分配和釋放空間.files/ls20.h6.gif" width=78
align=absMiddle border=0>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -