【C++內存管理之四】動態內存管理

一、malloc/free與new/delete的作用

new/delete與malloc/free都是用於管理動態內存。其中malloc/free是C標準庫函數,用於C程序的動態內存管理;new/delete是C++的運算操作符,用於動態內存管理,功能完全覆蓋malloc/free。
new / new[]:完成兩件事,先底層調用 malloc 分了配內存,然後調用構造函數(創建對象)。
delete/delete[]:也完成兩件事,先調用析構函數(清理資源),然後底層調用 free 釋放空間。
問題:有了new/delete爲什麼還要malloc/free?
因爲C++程序經常要調用C函數,而C程序只能用malloc/free管理動態內存。

二、new/delete與malloc/free區別

相同點:

用於動態申請內存和釋放內存

不同點:

  1. 操作對象不同
    對於用戶自定義的對象而言,用malloc/free無法滿足動態管理對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由於malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加於malloc/free。因此C++需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符delete
  2. 用法不同
    1、因爲new 內置了sizeof、類型轉換等功能,所以new 會自動計算需要分配的空間. 而malloc需要手動計算.
    2、new是類型安全的,而malloc需要強轉.(void* 編譯器無法指出錯誤).
    3、new將調用構造函數,而malloc不能;delete將調用析構函數,而free不能

三、new / delete拓展

new / delete / operator new / operator delete / placement new / placement delete

  1. new 操作符做了兩件事情: 1,申請內存空間 2,進行初始化
  2. operator new 類似於C中malloc,只負責分配內存空間
    void *buffer = operator new(sizeof(string));
  3. placement new: 定位new, 用於在給定的內存中初始化對象.
    已分配好的內存可以反覆利用,有效的避免內存碎片問題。
    如,用operator new分配了內存空間,然後後placement new進行初始化
    void *buffer = operator new(sizeof(string));
    buffer = new(buffer) string(“abc”);
  4. new operator 可以分解 operator new 和 placement new 兩個動作

四、內存耗盡怎麼辦

1、判斷指針是否爲NULL,並用retuen語句終止。
2、判斷指針是否爲NULL,並用exit(1)函數終止。
3、設置new和malloc異常處理函數。_set_new_hander函數爲異常處理函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章