今天在愛立信南京研發(fā)中心筆試碰到一個(gè)簡答題為:delete p和delete[] p的區(qū)別,答的不好,下面從網(wǎng)上拷貝一篇文章,來具體說明。 operator new 和 operator delete函數(shù)有兩個(gè)重載版本,每個(gè)版本支持相關(guān)的new表達(dá)式和delete表達(dá)式: void* operator new (size_t); // allocate an object 熟悉C的朋友看到這里可能會(huì)很奇怪: 在c中釋放內(nèi)存用free(void *)【注意這里只有一個(gè)參數(shù)void *】 為什么到了C++里會(huì)出現(xiàn)兩個(gè)!按理說delete 會(huì)調(diào)用free釋放內(nèi)存的?。?br>另外delete []是如何知道刪除的對(duì)象個(gè)數(shù)的? 另外一般的教材比如《高質(zhì)量C++編程指南》都會(huì)這么說: 在用delete 釋放對(duì)象數(shù)組時(shí),留意不要丟了符號(hào)‘[]’。例如 delete []objects; // 正確的用法 delete objects; // 錯(cuò)誤的用法 后者相當(dāng)于delete objects[0],漏掉了另外99 個(gè)對(duì)象 這樣的描述當(dāng)然是錯(cuò)誤的,而且會(huì)誤導(dǎo)觀眾 為了解決問題,打開vc6,輸入以下代碼: class A 咦,不是說等同于delete p[0]嗎? 為了看看究竟,只好動(dòng)用那多年以前就忘光了的匯編 經(jīng)過一番折騰,最后連猜帶蒙得出下面的觀點(diǎn): 1 如果對(duì)象無析構(gòu)函數(shù)(包括不需要合成析構(gòu)函數(shù),比如注釋掉~A和string s兩行代碼) delete會(huì)直接調(diào)用operator delete并直接調(diào)用free釋放內(nèi)存 這個(gè)時(shí)候的new=new [](僅在數(shù)量上有差異),delete=delete[] 2 如果對(duì)象存在析構(gòu)函數(shù)(包括合成析構(gòu)函數(shù)),則【這個(gè)才是重點(diǎn)】: new []返回的地址會(huì)后移4個(gè)字節(jié),并用那4個(gè)存放數(shù)組的大小!而new不用后移這四個(gè)字節(jié) delete[]根據(jù)那個(gè)4個(gè)字節(jié)的值,調(diào)用指定次數(shù)的析構(gòu)函數(shù) ,同樣delete也不需要那四個(gè)字節(jié) 結(jié)果就是在不恰當(dāng)?shù)氖褂胐elete 和delete []調(diào)用free的時(shí)候會(huì)造成4個(gè)字節(jié)的錯(cuò)位,最終導(dǎo)致debug assertion failed! 再回到《高質(zhì)量C++編程指南》: delete []objects; // 正確的用法 delete objects; // 錯(cuò)誤的用法 后者相當(dāng)于delete objects[0],漏掉了另外99 個(gè)對(duì)象 嚴(yán)格應(yīng)該這樣說:后者相當(dāng)于僅調(diào)用了objects[0]的析構(gòu)函數(shù),漏掉了調(diào)用另外99 個(gè)對(duì)象的析構(gòu)函數(shù),并且在調(diào)用之后釋放內(nèi)存時(shí)導(dǎo)致異常(如果存在析構(gòu)函數(shù)的話),如果對(duì)象無析構(gòu)函數(shù)該語句與delete []objects相同 注: 1 測(cè)試環(huán)境vc6 2 不保證觀點(diǎn)正確 3 歡迎指正 由new分配的一個(gè)數(shù)組空間,比如說 int *array=new int[50],當(dāng)用delete釋放這個(gè)空間時(shí),用語句delete []array和delete array是否等價(jià)! C++告訴我們?cè)诨厥沼?new 分配的單個(gè)對(duì)象的內(nèi)存空間的時(shí)候用 delete,回收用 new[] 分配的一組對(duì)象的內(nèi)存空間的時(shí)候用 delete[]。 關(guān)于 new[] 和 delete[],其中又分為兩種情況:(1) 為基本數(shù)據(jù)類型分配和回收空間;(2) 為自定義類型分配和回收空間。 #include <stdio.h> 但是對(duì)于 (2),情況就發(fā)生了變化。請(qǐng)看下面的程序。 #include <stdio.h>
測(cè)了一下,好像沒有區(qū)別,又想不起在什么地方能用到delete[],大家評(píng)論一下。 #include <iostream>; 輸出: 所以一個(gè)簡單的使用原則就是:new 和 delete、new[] 和 delete[] 對(duì)應(yīng)使用。 |
|