天天看點

從零開始的C++(記憶體管理)

C++的記憶體管理

1、new/delete

  • new/delete是C++具備申請/釋放堆記憶體功能的運算符,相當于C語言中的malloc和free。
  • new + 類型 會自動計算類型所需要的位元組數,然後從堆中配置設定對應位元組數的記憶體,并傳回記憶體的首位址(具備類型)
  • delete + 指針 會自動釋放堆記憶體
  • 注意:new/delete 與 malloc/free 不能混用,因為new和delete會自動調用類、結構的構造函數、析構函數

2、數組的配置設定與釋放

  • new + 類型[n] n表示數組的長度,如果類、結構會自動調用n此構造函數
  • delete [] + 指針 通過new[]配置設定的記憶體,必須通過delete[]釋放
  • new[] 傳回值前4個位元組中存放在數組的長度

3、重複釋放

  • delete /delete[] 不能重複釋放同一塊記憶體
  • delete /delete[] 釋放野指針的後果不确定,但可以釋放空指針是安全的

4、記憶體配置設定失敗

  • 當配置設定的記憶體過大,沒有能滿足需求的整塊記憶體就會抛出異常 std::bad_alloc
  • new/delete 與C語言malloc相同點和不同點

    不同點

    1、身份 前者運算符 後者标準庫函數

    2、參數 前者類型(自動計算) 後者位元組數(手動計算)

    3、傳回值 帶類型的位址 void*位址

    4、調用構造 自動調用 不會調用構造/析構函數

    5、出錯 抛異常 傳回空 NULL

    相同點

    1、不能重複釋放

    2、可以釋放NULL

    3、都能管理堆記憶體

    注意:在C++中 盡量使用引用、new/delete

繼續閱讀