【C++基礎】—— new、delete 和 malloc、free 的區別

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必須配對使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章