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

2022-07-04 08:39:08 字數 1082 閱讀 2355

首先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。

C語言中的malloc和free

最近在研究php自定義函式的實現,其中php自定義函式在傳遞引數時,是放到人為的乙個棧中,這個跟寫c程式時,引數入棧的這個棧還不一樣,其中延伸到了 malloc 以及free 有人說在free p 後,要將p設定為null,在查詢了一翻資料後,大體上弄明白了是怎麼回事 malloc是向os要一塊記憶...

C 語言 free 函式的原理

今天在網上看到了這樣乙個問題,如果malloc 了一塊字串的記憶體,然後,它改變了這個字串的大小,問會不會有一部分記憶體沒有被釋放掉。這個問題,以前的確沒有仔細想過。當然,我覺得是肯定會釋放掉的,但是一直沒有了解過free 的原理,不敢亂說。我看了一下作業系統的記憶體管理,基本上是這樣的,當然各個系...

C語言中的malloc和free造成記憶體洩露?

首先,說一下我對記憶體洩露的理解,記憶體洩露是指 程式中一塊不再使用的記憶體沒有被釋放,造成記憶體保持占用狀態,使作業系統不能將記憶體分配給其它的程式 程序 在c語言,用的最多的管理記憶體的函式莫過於malloc和free了,下面我用vc6.0做了乙個小測試,原始碼如下 然後,使用vc6.0來除錯這...