[原創(chuàng)文章歡迎轉(zhuǎn)載,但請(qǐng)保留作者信息]
Justin 于 2009-12-10
Item16基本可以一語(yǔ)帶過(guò),因?yàn)橹v得本來(lái)就很簡(jiǎn)單:
-
用new分配一個(gè)內(nèi)存對(duì)象時(shí),語(yǔ)法格式是new a;
用delete釋放一個(gè)內(nèi)存對(duì)象時(shí),語(yǔ)法格式是delete a;
-
用new分配一組內(nèi)存對(duì)象時(shí),語(yǔ)法格式是new a [num_of_elem];
用delete釋放一組內(nèi)存對(duì)象時(shí),語(yǔ)法格式是delete [] a;
不要錯(cuò)用了就可以。原因呢,也很簡(jiǎn)單:
new或是delete包含了兩個(gè)階段:
-
new:申請(qǐng)并分配內(nèi)存空間;調(diào)用構(gòu)造函數(shù)構(gòu)造即將使用空間的對(duì)象
-
delete:調(diào)用析構(gòu)函數(shù)析構(gòu)使用空間的對(duì)象;釋放內(nèi)存
分配內(nèi)存給一組對(duì)象的時(shí)候,編譯器一般會(huì)在這一片內(nèi)存前端(或是其他什么地方)插入一小段信息,用來(lái)標(biāo)明這片內(nèi)存是給多少個(gè)對(duì)象的,然后反復(fù)調(diào)用構(gòu)造函數(shù)來(lái)創(chuàng)建這一組對(duì)象。當(dāng)用delete []的時(shí)候,釋放內(nèi)存的操作就會(huì)以該信息為依據(jù),反復(fù)調(diào)用對(duì)象的析構(gòu)函數(shù)對(duì)這組對(duì)象進(jìn)行釋放。(下面的[n]就是這段信息)
[n][MEM]
而如果只是分配內(nèi)存給一個(gè)對(duì)象,這段信息就不存在了。直接在這片內(nèi)存上應(yīng)用析構(gòu)函數(shù)。
于是用delete []去釋放new的內(nèi)存,或是用delete去釋放new []的內(nèi)存,都會(huì)造成不可預(yù)計(jì)的后果。