在c語言中,我們常用malloc、calloc、realloc和free等函式來進行動態記憶體管理。
但是在c++中,我們則需要用到某些操作符進行動態記憶體管理。
new / delete —— 動態管理物件
new / delete —— 動態管理陣列
▲new / delete 和 new / delete 一定要匹配使用!否則會記憶體洩漏!
void test1()
對c語言有動態記憶體管理的人可能會有疑惑:明明c語言中已經有 malloc / free 函式進行動態記憶體管理了,c++又相容c語言,那為什麼我們還要使用 new / delete 和 new / delete 呢?
這要從 new / delete 背後的機制談起了。
在使用new時,編譯器進行兩步操作:
1.呼叫 std::operator new() 函式進行分配記憶體(在 operator new 中呼叫了 malloc()函式)
2.呼叫被分配型別的建構函式
在使用delete時,編譯器進行兩步操作: 1.
呼叫被分配型別的析構函式 2.
呼叫 std::operator delete() 函式進行釋放記憶體(在operator delete() 中呼叫了 free()函式)
在使用new[n]時,編譯器進行兩步操作:
1.呼叫 std::operator new() 函式進行分配記憶體(在 operator new 中呼叫了 malloc()函式)
2.呼叫n次被分配型別的建構函式
在使用delete時,編譯器進行兩步操作: 1.
呼叫n次被分配型別的析構函式 2.
呼叫 std::operator delete() 函式進行釋放記憶體(在operator delete() 中呼叫了 free()函式)
整體來說,malloc() 在申請記憶體時候不會呼叫建構函式,free() 釋放記憶體之後也不會呼叫析構函式,而 new / delete 進行申請 / 釋放記憶體的時候則會呼叫,所以簡單的說,在對c++內建型別進行動態記憶體管理的時候,使用 malloc() / free() 和 new / delete 的差別不大,但是在對使用者自定義型別進行動態記憶體管理的時候,則必須使用 new / delete 或 new / delete。
在使用new時,編譯器進行兩步操作:
1.呼叫 std::operator new() 函式進行分配記憶體(在 operator new 中呼叫了 malloc()函式)
2.呼叫被分配型別的建構函式
在使用delete時,編譯器進行兩步操作:
1.呼叫被分配型別的析構函式
2.呼叫 std::operator delete() 函式進行釋放記憶體(在operator delete() 中呼叫了 free()函式)
C語言動態記憶體管理
1 概述 動態儲存管理的基本問題是 系統如何按請求分配記憶體,如何 記憶體再利用。提出請求的使用者可能是系統的乙個作業,也可能是程式中的乙個變數。空閒塊 未曾分配的位址連續的記憶體區稱為 空閒塊 占用塊 已分配給使用者使用的位址連續的記憶體區稱為 占用塊 系統剛剛啟動時,整個記憶體可看做乙個大的 空...
C語言動態記憶體管理
c系統的函式庫中提供了了程式動態申請和釋放記憶體儲存塊的庫函式,下面將分別介紹。1 malloc 函式 a 該函式的原型 void malloc size t size b 該函式只有乙個引數,且形參size是無符號整型,該引數代表申請空間的位元組數。c 返回值 如果記憶體池中的可用記憶體滿足需求,...
C語言動態記憶體管理
在說明c語言記憶體管理之前,要知道什麼是記憶體,記憶體我個人認為可以理解為帶有標籤的盒子,所謂的帶標籤的盒子就像我們住的寢室一樣有門牌號,盒子內只能儲存固定型別的資料或變數,就如男生寢室只能住男生一樣。那麼c語言中有多少種盒子呢?有靜態儲存區 動態儲存區 內部暫存器區域。我們通常定義的變數如果沒有特...