1. 程式人生 > >C語言的的free和c++的delete的區別

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

表示 log 一個數 重復 csdn 應用 malloc null 析構

首先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就可以既釋放對象的內存的同時,調用這個對象的析構函數。

共同之處:

它們都是只把指針所指向的內存釋放掉了,並沒有把指針本身幹掉。在free和delete之後,都需要把指向清理內存的指針置為空,即p=NULL,否則指針指向的內存空間雖然釋放了,但是指針p的值還是記錄的那塊地址,該地址對應的內存是垃圾,p就成了“野指針”。同樣會使人認為p是個合法的指針,如果程序較長,我們通常在使用一個指針前會檢查p!=NULL,這樣就起不到作用了。此時如果再釋放p指向的空間,編譯器就會報錯,因為釋放一個已經被釋放過的空間是不合法的。而將其置為NULL之後再重復釋放就不會產生問題,因為delete一個0指針是安全的。

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

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

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

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

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

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