new/delete 與 malloc/free的區別
阿新 • • 發佈:2017-07-22
blog 們的 無法 構造函數 分配 錯誤 let light delet 一、概述
在C++中,申請動態內存與釋放動態內存用new/delete 與 malloc/free都可以,而且他們的存儲方式相同,new/malloc申請的動態內存位於堆中,無法被操作系統自動回收,需要對應的delete也free釋放空間。
malloc/free是C/C++語言的標準庫函數,在C語言中需要頭文件#include<stdlib.h>的支持。而new/delete是C++的運算符。對於類對象而言,malloc/free無法滿足動態對象的要求,對象要求在創建的同時自動執行構造函數,對象消亡時自動執行析構函數,malloc/free不在編譯器的控制權限之內,無法執行構造函數和析構函數。
二、區別
1、new能自動計算需要分配的內存空間,而malloc需要手工計算字節數。
delete和free被調用後,內存不會立即回收,指針也不會指向空,delete或free僅僅是告訴操作系統,這一塊內存被釋放了,可以用作其他用途。但是由於沒有重新對這塊內存進行寫操作,所以內存中的變量數值並沒有發生變化,出現野指針的情況。因此,釋放完內存後,應該講該指針指向NULL。
int *p = new int[2]; int *q = (int *)malloc(2*sizeof(int));
2、new與delete直接帶具體類型的指針,malloc和free返回void類型的指針。 3、new類型是安全的,而malloc不是。例如int *p = new float[2];就會報錯; 而int *p = malloc(2*sizeof(int))編譯時編譯器就無法指出錯誤來。 4、new一般分為兩步:new操作和構造。new操作對應與malloc,但new操作可以重載,可以自定義內存分配策略,不做內存分配,甚至分配到非內存設備上,而malloc不行。 5、new調用構造函數,malloc不能;delete調用析構函數,而free不能。 6、malloc/free需要庫文件stdlib.h的支持,new/delete則不需要! 三、註意事項
new/delete 與 malloc/free的區別