new、delete 和 malloc、free 的區別
區別 | malloc&free | new&delete |
---|---|---|
區別1 | C/C++語言的標準庫函數 | C++的運算符 |
區別2 | 無法滿足動態對象的要求,因爲malloc&free是庫函數而不是運算符,因此不再編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加於malloc/free。 | new和delete可以在對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數 |
區別3(關於構造函數&析構函數) | 因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符delete。注意new/delete不是庫函數。—簡而言之 new/delete能進行對對象進行構造和析構函數的調用進而對內存進行更加詳細的工作,而malloc/free不能。 | 因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符delete。注意new/delete不是庫函數。—簡而言之 new/delete能進行對對象進行構造和析構函數的調用進而對內存進行更加詳細的工作,而malloc/free不能。 |
區別4(關於返回值) | malloc分配失敗時,返回的是空指針 | new拋出std::bad_alloc異常 |
區別5 | malloc/free需要頭文件庫函數支持。 | new/delete是保留字直接用,是運算符! |
共同點以及聯繫:
- 它們都可用於申請動態內存和釋放內存。但是new能夠自動分配空間大小,而malloc需要計算字節數。
- 既然new/delete的功能完全覆蓋了malloc/free,爲什麼C++還保留malloc/free呢?
C++常要調用C函數,而C程序只能用malloc/free管理動態內存。
如果用free
釋放new
創建的動態對象,那麼該對象因無法執行析構函數而可能導致程序出錯。
如果用delete
釋放malloc
申請的動態內存,理論上講程序不會出錯,但是該程序的可讀性很差。
所以new/delete,malloc/free必須配對使用。