new和delete底層解析

2021-08-29 01:51:09 字數 1644 閱讀 4427

2023年04月05日 10:26:44 龍躍十二 閱讀數:205 標籤: c++

newdelete 更多

個人分類: c++

所屬專欄: c++

先寫個栗子看看new和delete的用法:

再看看他們之間的關係:

1)malloc/free是c/c++語言的標準庫函式,new/delete是c++的運算子

malloc與free是c++/c 語言的標準庫函式,new/delete 是c++的運算子。對於非內部資料類的物件而言,光用maloc/free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式, 物件消亡之前要自動執行析構函式。由於malloc/free 是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加malloc/free。 

2)用法上也有所不同。

函式malloc 的原型如下: 

void * malloc(size_t size); 

● malloc 申請一塊長度為size 個位元組 

● malloc 返回值的型別是void ,所以在呼叫malloc 時要顯式地進行型別轉換,將void 轉換成所需要的指標型別。 

● malloc 函式本身並不識別要申請的記憶體是什麼型別,它只關心記憶體的總位元組數。 

函式free 的原型如下: 

void free( void * memblock ); 

● 如果p 是null 指標,那麼free對p 無論操作多少次都不會出問題。 

● 如果p 不是null 指標,那麼free 對p連續操作兩次就會導致程式執行錯誤。

運算子new 使用起來要比函式malloc 簡單得多,例如:

int p1 = (int )malloc(size); 

int *p2 = new int[size]; 

● new 內建了sizeof、型別轉換和型別安全檢查功能。 

● 對於非內部資料型別的物件而言,new 在建立動態物件的同時完成了初始化工作。 

● 如果物件有多個建構函式,那麼new 的語句也可以有多種形式。

在用delete 釋放物件陣列時,留意不要丟了符號『』。例如

● delete p2; // 正確的用法 

● delete p2; // 錯誤的用法 

後者相當於delete p2[0],漏掉了另外size-1個物件。

說來說去我們要明白new的底層是呼叫malloc,delete底層呼叫的是free。在c++中我們使用時要明白二者的區別和聯絡。在使用new時一定用delete釋放,用malloc時一定用free釋放,這樣匹配防止程式以外崩潰。

new和delete底層解析

先寫個栗子看看new和delete的用法 再看看他們之間的關係 1 malloc free是c c 語言的標準庫函式,new delete是c 的運算子 malloc與free是c c 語言的標準庫函式,new delete 是c 的運算子。對於非內部資料類的物件而言,光用maloc free 無法...

new和delete解析 c 筆記

1.new delete 和operator new operator delete和malloc free的關係 new,delete運算子 當我們使用一條new表示式時,實際上執行了三步操作 第一步,new表示式呼叫乙個名為operator new 或者operator new 的標準庫函式,該...

深入new和delete小結

new和delete是c 中使用頻率非常高的兩個關鍵字,可以說c 記憶體操作的核心就在於這兩個關鍵字,近幾天閱讀了相關的文章,發現自己對於這兩個關鍵字的理解太過膚淺,因此做了一些個人總結。首先要明確一點,new和delete所操作的記憶體全部是在堆區,這個區域的記憶體和棧區是不一樣的,不會自動釋放,...