C語言的的free和c++的delete的區別

首先free對應的是malloc;delete對應的是new;free用來釋放malloc出來動態內存,delete用來釋放new出來的動態內存空間。數組

應用的區別爲:安全

1. 數組的時候int *p=(int*)malloc(10*sizeof(int)) 釋放的時候 free(p)便可;這是由於編譯器對malloc作了一些特殊的處理,以保證能夠正確釋放內存。而當int *p=new int[10]釋放的時候應爲delete []p,注意[]的做用說明釋放的是一個數組的內存,若是delete p則只是釋放的p[0],其他9個int的內存沒有釋放;這是由於當指明爲[]的時候,編譯器其實是作了一個循環來釋放這個數組的全部內存。函數

2. 在類和對象的時候會有很大區別。在使用malloc和free來處理動態內存的時候,僅僅是釋放了這個對象所佔的內存,而不會調用這個對象的析構函數;使用new和delete就能夠既釋放對象的內存的同時,調用這個對象的析構函數。.net

共同之處:指針

它們都是隻把指針所指向的內存釋放掉了,並無把指針自己幹掉。在free和delete以後,都須要把指向清理內存的指針置爲空,即p=NULL,不然指針指向的內存空間雖然釋放了,可是指針p的值仍是記錄的那塊地址,該地址對應的內存是垃圾,p就成了「野指針」。一樣會令人認爲p是個合法的指針,若是程序較長,咱們一般在使用一個指針前會檢查p!=NULL,這樣就起不到做用了。此時若是再釋放p指向的空間,編譯器就會報錯,由於釋放一個已經被釋放過的空間是不合法的。而將其置爲NULL以後再重複釋放就不會產生問題,由於delete一個0指針是安全的。對象

 

在這裏關於指針和動態申請的內存空間總結以下:blog

1.      指針消亡了,並不表示它指示的動態內存會自動釋放;內存

2.      動態內存釋放掉了,若是這個內存是一個動態對象,則並不表示必定會調用這個對象的析構函數;編譯器

動態內存釋放掉了,而且調用了析構函數,並不表示指針會消亡或者自動變成了NULL。編譯

 

原文地址:http://blog.csdn.net/gukesdo/article/details/7506155

相關文章
相關標籤/搜索