unsigned long *pA = new unsigned long; *pA = 10;
unsigned long *pB = new unsigned long[ *pA ];
上面就申請了兩塊內(nèi)存,pA所指的內(nèi)存(即pA的值所對應(yīng)的內(nèi)存)是4字節(jié)大小,而pB所指的內(nèi)存是4*10=40字節(jié)大小。應(yīng)該注意,由于new是一個操作符,其結(jié)構(gòu)為new <類型名>[<整型數(shù)字>]。它返回指針類型的數(shù)字,其中的<類型名>指明了什么樣的指針類型,而后面方括號的作用和定義數(shù)組時一樣,用于指明元素的個數(shù),但其返回的并不是數(shù)組類型,而是指針類型。
delete pA; delete[] pB;
注意delete操作符并不返回任何數(shù)字,但是其仍被稱作操作符,看起來它應(yīng)該被叫做語句更加合適,但為了滿足其依舊是操作符的特性,C++提供了一種很特殊的數(shù)字類型——void。其表示無,即什么都不是,這在《C++從零開始(七)》中將詳細(xì)說明。因此delete其實是要返回數(shù)字的,只不過返回的數(shù)字類型為void罷了。
注意上面對pA和pB的釋放不同,因為pA按照最開始的書寫,是new unsigned long返回的,而pB是new unsigned long[ *pA ]返回的。所以需要在釋放pB時在delete的后面加上“[]”以表示釋放的是數(shù)組,不過在VC中,不管前者還是后者,都能正確釋放內(nèi)存,無需“[]”的介入以幫助編譯器來正確釋放內(nèi)存,因為以Windows為平臺而開發(fā)程序的VC是按照Windows操作系統(tǒng)的方式來進(jìn)行內(nèi)存分配的,而Windows操作系統(tǒng)在釋放內(nèi)存時,無需知道欲釋放的內(nèi)存塊的長度,因為其已經(jīng)在內(nèi)部記錄下來(這種說法并不準(zhǔn)確,實際應(yīng)是C運(yùn)行時期庫干了這些事,但其又是依賴于操作系統(tǒng)來干的,即其實是有兩層對內(nèi)存管理的包裝,在此不表)。