1. 程式人生 > >c++中有了malloc/free,為什麼還需要new/delete?

c++中有了malloc/free,為什麼還需要new/delete?

一:malloc/free是c/c++中的標準庫函式,new/delete是c++中的運算子。它們都用於申請動態記憶體和釋放記憶體。

二:對於非內部資料物件(eg:類物件),只用malloc/free無法滿足動態物件的要求。這是因為物件在建立的同時需要自動執行建構函式,物件在消亡之前要自動執行解構函式,而由於malloc/free是庫函式而不是運算子,不在編譯器的控制權限內,也就不能自動執行建構函式和解構函式。因此,不能將執行建構函式和解構函式的任務強加給malloc/free。所以,在c++中需要一個能完成動態記憶體分配和初始化工作的運算子new,以及一個能完成清理和釋放記憶體工作的運算子delete。

三:

1:new建立的是一個物件,malloc分配的是一塊記憶體區域,用指標來訪問,並且可以在區域裡面移動指標;

2:對於內部資料型別,由於其沒有建構函式和解構函式的要求,對於內部資料型別來講,malloc/free和new/delete的作用是等價的,都是用來申請動態記憶體和釋放記憶體。

四:什麼是內部資料型別和非內部資料型別?

1:內部資料型別是編譯器本身就認識的,不需要使用者自己定義。如:基本資料型別:int,char,double等都是內部資料型別;2:非內部資料型別不是編譯器本身就認識的,需要使用者自己定義才能讓編譯器識別。如:由class,struct,union等關鍵字修飾 的變數都是非內部資料型別。

五:為什麼庫函式不在編譯器控制權限內,而運算子在?

庫函式是已經編譯的程式碼,編譯器不會在編譯檢查,由連結器將庫同用戶寫的程式碼合成exe檔案。而運算子是否正確,編譯器在編譯掃描分析時就可以判定。