malloc/free與new/delete的區別:
相同點:都可用於動態記憶體分配與釋放;
不同點:
1):操作物件有所不同。
malloc/free是c/c++語言的標準庫函式,new/delete是c++的運算子。
由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,所以無法執行建構函式和析構函式;
new的執行過程:
//new的執行過程:
1:首先呼叫名為operator new的標準庫函式,分配足夠大的原始的未型別化的記憶體,用來儲存指定型別的乙個物件;
2:接下來,執行該型別的乙個建構函式,用指定初始化式構造物件;
3:最後返回指向新分配並構造的物件的指標。
delete的執行過程:
1:首先,對sp指向的物件執行適當的析構函式;
2:然後,用過呼叫名為operator delete的標準庫函式釋放該物件所用記憶體。
以上operator new 與 operator delete 分別對應於malloc 與free。
2):用法上也有所不同:
函式malloc的原型如下:
void *malloc(size_t size);
用malloc申請一塊長度為lengh的整形型別的記憶體,程式如下:
int *p = (int*)malloc( sizeof(int) *length);1:malloc返回值的型別為void*,所以在呼叫malloc時要顯式地進行型別轉換,將void*轉換成所需要的指標型別;
2:malloc函式本身並不識別要申請的記憶體是什麼型別,它只關心記憶體的總位元組數。
函式free的原型如下:
void free(void *memblock);語句free(p)用來釋放記憶體,如果p為null指標,那麼無論free對p進行多少次操作都不會出現問題;
如果p不是null指標,那麼free對p連續操作兩次就會導致程式執行錯誤。
運算子new使用起來就比函式malloc簡單多了,例如:
int *p2 = newint[length];
這是因為new內建了sizeof、型別轉換和型別安全檢查功能,對於非內部資料型別的物件而言,new在建立動態物件的同時完成了初始化工作(呼叫建構函式)。
如果用new建立陣列,那麼只能使用物件的無引數建構函式。例如:
obj *objects = new obj[100];//建立100個動態物件
不能寫成:
obj *objects = new obj[100](1);//建立100個動態物件並同時賦值為1 error
在用delete釋放物件陣列時,留意不要丟了符號""。例如:
delete objects;//正確的用法
delete objects;//
錯誤的用法
總結:
1):malloc/free是c/c++語言的標準庫函式,new/delete是c++的運算子;
2):new自動計算需要分配的空間,而malloc需要手工計算計算位元組數;
3):new是型別安全的,而malloc不是;例如:
int *p = newfloat[2];//
編譯時指出錯誤
int *p = (int*)malloc(2*sizeof(float));//
編譯時無法指出錯誤
4);new呼叫operator new分配足夠的空間,並呼叫相關物件的建構函式,而malloc不能呼叫建構函式;
delete呼叫相關物件的析構函式,然後呼叫operator delete以釋放空間,而malloc不能呼叫析構函式;
5):malloc/free需要庫檔案支援,new/delete則不需要。
malloc free與new delete的區別
相同點 都可用於申請動態記憶體和釋放記憶體 不同點 1 操作物件有所不同。malloc與free是c c 語言的標準庫函式,new delete 是c 的運算子。對於非內部資料類的物件而言,光用maloc free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件消亡之前要自動執行析...
malloc free與new delete的區別
相同點 都可用於申請動態記憶體和釋放記憶體 不同點 1 操作物件有所不同。malloc與free是c c 語言的標準庫函式,new delete 是c 的運算子。對於非內部資料類的物件而言,光用maloc free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件消亡之前要自動執行析...
malloc free與new delete的區別
相同點 都可用於申請動態記憶體和釋放記憶體 不同點 1 操作物件有所不同。malloc與free是c c 語言的標準庫函式,new delete 是c 的運算子。對於非內部資料類的物件而言,光用maloc free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件消亡之前要自動執行析...