new和delete解析 c 筆記

2021-08-18 14:30:10 字數 2875 閱讀 2341

1.new/delete 和operator new/operator delete和malloc/free的關係 

new,delete運算子:

當我們使用一條new表示式時,實際上執行了三步操作:

第一步,new表示式呼叫乙個名為operator new(或者operator new)的標準庫函式,該函式分配一塊足夠大的,原始的,未命名的記憶體空間以便儲存特定型別的物件(或物件陣列);

第二部,編譯器執行相應的建構函式以構造這些物件,並為其傳入初始值;

第三部,返回乙個指向該物件的指標。

當我們使用一條delete表示式時,實際執行了兩部操作:

第一步對指標所指的物件或陣列中的元素執行對應的析構函式;

第二部,編譯器呼叫名為operator delete(或者 operatordelete)的標準庫函式釋放記憶體空間。

我們不能改變new/delete的行為,但是通過過載operator new() 和 operator delete()可以實現自己想要的記憶體管理方式。

關於operator new有幾點要注意:

(1)當無法滿足所要求分配的空間時,則

->如果有new_handler,則呼叫new_handler,否則

->如果沒要求不丟擲異常(以nothrow引數表達),則執行bad_alloc異常,否則

->返回0

(2)過載時,返回型別必須宣告為void*

(3)過載時,第乙個引數型別必須為表達要求分配空間的大小(位元組),型別為size_t

(4)過載時,可以帶除(3)以外的其它引數 

他們之間的呼叫關係

2.new時底層處理的機制 

3.new/delete和malloc/free的區別 

1.操作物件有所不同

malloc與free是c++/c 語言的標準庫函式,new/delete 是c++的運算子。對於非內部資料類的物件而言,光用malloc/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 的語句也可以有多種形式。

如果用new 建立物件陣列,那麼只能使用物件的無引數建構函式。例如

obj *objects = new obj[100];       // 建立100 個動態物件

不能寫成

obj *objects = new obj[100](1);        // 建立100 個動態物件的同時賦初值1

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

delete objects; // 正確的用法

delete objects; // 錯誤的用法

後者相當於delete objects[0],漏掉了另外99 個物件。

1、new自動計算需要分配的空間,而malloc需要手工計算位元組數

2、new是型別安全的,而malloc不是,比如:

int* p = new float[2]; // 編譯時指出錯誤

int* p = malloc(2*sizeof(float)); // 編譯時無法指出錯誤

new operator 由兩步構成,分別是 operator new 和 construct

3、operator new對應於malloc,但operator new可以過載,可以自定義記憶體分配策略,甚至不做記憶體分配,甚至分配到非記憶體裝置上。而malloc無能為力

4、new將呼叫constructor,而malloc不能;delete將呼叫destructor,而free不能。

5、malloc/free要庫檔案支援,new/delete則不要。

18051109457

2本質區別:

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

對於使用者自定義的物件而言,用maloc/free無法滿足動態管理物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。因此c++需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。

new和delete底層解析

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

new和delete底層解析

2018年04月05日 10 26 44 龍躍十二 閱讀數 205 標籤 c newdelete 更多 個人分類 c 所屬專欄 c 先寫個栗子看看new和delete的用法 再看看他們之間的關係 1 malloc free是c c 語言的標準庫函式,new delete是c 的運算子 malloc與...

筆記 動態陣列new和delete

1 c 中可以使用指標來動態建立陣列,具體的例子如下 建立乙個n n的矩陣 int result 定義乙個二維指標陣列 int n cin n result new int n for int i 0 inew int n for int i 0 ifor int j 0 j0 給陣列賦初值 下面對...