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 給陣列賦初值 下面對...