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