malloc、free、new、delete

一、malloc和free

malloc是一個函數,函數原型爲:

extern void*malloc(unsigned int num_bytes);分配長度爲num_bytes字節的內存塊。如果分配成功則返回指向被分配內存的指針,分配失敗返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。

void *malloc(int size);malloc 向系統申請分配指定size個字節的內存空間,返回類型是 void* 類型。void* 表示未確定類型的指針。C,C++規定,void* 類型可以強制轉換爲任何其它類型的指針。

free函數的原型爲:void free(void *FirstByte): 該函數是將之前用malloc分配的空間還給程序或者是操作系統,也就是釋放了這塊內存,讓它重新得到自由。傳入的參數爲malloc返回的首地址,當使用malloc時,操作系統會記錄malloc申請的首地址和地址範圍,當使用free釋放時,首地址必須是一定的,並且會釋放一段內存。

注意事項:

1.申請內存空間後,必須檢查是否分配成功,因爲malloc申請內存失敗並不會拋出一個異常,而是會返回一個NULL指針;

2.當不在需要申請的內存空間時,需要手動釋放,並且將指針指向NULL,避免誤操作;

3.malloc和free是成對出現的,如果使用了malloc而沒有使用free則會造成內存泄露,如果多次釋放則可能會出現錯誤;

4.malloc函數的返回值爲void*,void*可以轉換爲任意類型的指針,一般會在前面進行強制類型轉換,避免編譯器報錯。

5.malloc和free到底做了哪些事情;

a.當調用malloc函數時,系統內核會從空閒的內存(一般會使用特定的數據結構來存儲)當中選出一塊相應大小的內存與指針綁定,並且將選中的這塊內存從保存空閒的內存數據結構當中提出;

b.當調用free函數時,free函數會將malloc綁定的內存與指針解除綁定,並重新將這塊內存放入到存放空閒內存的數據結構當中,但是並不會將內存當中的數據進行清除,因此堆內存都是髒的,釋放後仍然能被malloc綁定的指針訪問,因此一般在free之後將指針重新指向NULL,避免產生野指針。

二、new和delete

new是運算符,動態創建對象時,只需要指定數據類型,返回值是完整的類型指針;並且當new失敗後會拋出一個異常(即一箇中斷,程序會自動跳轉到相應中斷的地址中去執行,一般中斷地址會與一箇中斷處理函數的指針來綁定,跳轉到相應的中斷函數中去執行);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章