C++中delete與delete[]

來源:互聯網
上載者:User

這篇文章是CSDN C++論壇中多次討論到的一個問題。

先看下面程式:

#include <iostream>
using namespace std;
#include <string>

int main()
{
int *p=new int[5];
//delete p;
delete []p;
p=NULL;

//string *p=new string[5];
//delete p;
//delete []p;
//p=NULL;

return 0;
}

對於int類型和string類型,delete p和delete []p編譯器(vc6.0)會有不一樣的結果,對於int類型delete p和delete []p均可以編譯運行,而 對於string類型,delete p運行

後程式會崩潰。

下面是對這個問題網友的意見與我的總結:

(1)delete 與delete[]都會釋放所有記憶體,它們的不同點僅在於,根據得到的類型資訊是單個指標還是指向數組的指標,來決定調用解構函式的次數。而編譯器對所要刪除的那個指標到底是指向的單一對象還是對象數組的判斷依據就是"[]"的有無。若有'[]'編譯器得到的類型資訊就是指向數組的指標,然後調用多次解構函式;若沒有‘[]’編譯器得到的類型資訊就是單個指標,只調用一次解構函式。
其實delete操作本身就是做兩件事:
<1> 針對此處記憶體調用解構函式
<2> 然後釋放該處記憶體。
(詳見《Effective C++》(2nd)item 5 或 (3rd)item 16)。

 

(2)vc6.0和vs05中,delete和delete[]語句都是調用operator delete(),在vs05中調試,在跟進operator delete()中,可看到有這樣一句“_free_dbg( pUserData, pHead->nBlockUse );”而free要正確工作,有一個必要前提,即傳給它的地址確實是當初申請的記憶體首地址,否則,會出現assert錯誤。即在重載delete操作符後,某種情況下發現delete操作的指標地址不同於new操作所擷取的地址。從而出現assert錯誤,程式崩潰。

(3)在VC中,對於有顯式解構函式的對象, 在分配數組時其前會有一個4位元組首碼用來儲存數組元素個數. 如果用delete來釋放數組, 就會導致釋放的記憶體位址與分配時的記憶體位址出現4位元組偏差, 而導致災難性的錯誤.

(4)那麼什麼情況下,二者操作的指標地址不匹配呢?
經過反覆實驗測試,發現只要物件類型定義有顯式解構函式,那麼這個4位元組就肯定存在。也就是說,哪怕是我們自訂的一個類類型對象,只要我們沒有為這個類定義解構函式,那麼這個4位元組問題就不會出現;那麼該用delete[]的時候,用delete也不會報錯;那麼該用delete的時候,用delete[]也不會報錯,那麼...
本論題,由於內建類型沒有解構函式,而string有解構函式,這樣一種巧合,而把問題局限在了內建類型與自訂類型這樣的分類範圍上。所以我們這個問題準確的說,應該是顯式解構函式的存在影響了delete與delete[]的處理。

 

(5)一句話:該用delete[]時莫省略,這是C++標準。

 

原帖如下:

(1)http://topic.csdn.net/u/20080826/16/0c479e3d-737f-45c7-995e-bd316f5fa166.html

(2)http://topic.csdn.net/u/20080221/20/7c7093b9-62d7-4d70-b959-3a06e4327d46.html

(3)http://topic.csdn.net/u/20070712/07/57c7cfc6-7314-400d-86d2-230a72581ea5.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.