new和malloc,delete和free的區別

2021-09-24 03:51:28 字數 579 閱讀 1663

先說new和malloc:

new的底層也是通過malloc來開闢記憶體的,new比malloc多一項功能,就是開闢完記憶體,還可以進行初始化:

int *p=new int(10);
test *p=new test();
第一條語句是new的基本操作,10代表開闢整型記憶體的初始值。

第二條語句會在堆上開闢test型別的一塊記憶體,同時構造出乙個物件。

以上兩條malloc均辦不到。

new開闢記憶體失敗丟擲bad_alloc型別的異常,要捕獲異常才能判斷記憶體是否分配成功。而malloc記憶體開闢失敗返回的是null指標。

再談談delete和free:

delete比free多一項功能,就是不僅可以釋放記憶體,還可以析構指標指向的物件。

還有一點要補充:

new和delete不僅僅是運算子,它們實際上是運算子過載函式的呼叫,對應的函式名是operator new和operator delete,可以在全域性或者類的作用域中提供自定義的new和delete運算子的過載函式,以改變預設的malloc和free記憶體開闢釋放行為。

常規new和布局new

通常,new負責在堆 heap 中找到乙個能夠滿足要求的記憶體塊,new操作符還有另外一種變體,稱為布局 placement new操作符,它能夠讓你指定要使用的位置。要使用布局new,首先要包含標頭檔案new,它後面需要乙個提供位址的引數。話不多說看 newplace.cpp using plac...

定位的new和new 運算子

同一作用域下的同名函式,只要引數列表不同,即可過載。過載 new和 new 運算子時,函式的第 1個引數是固定的,表示申請分配記憶體的長度。使用者在不改變第 1個引數的情況下,可以隨意增加引數,過載多個 new和 new 運算子函式。乙個比較實際的例子就是過載定位的 new和 new 運算子,即為 ...

C 用new和不用new建立類物件

1,new建立類物件,使用完後需使用delete刪除,跟申請記憶體類似。所以,new有時候又不太適合,比如在頻繁呼叫場合,使用區域性new類物件就不是個好選擇,使用全域性類物件或乙個經過初始化的全域性類指標似乎更加高效。2,非new建立類物件,建立方式,new物件指標作為函式引數和返回值需要手動釋放...