先說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物件指標作為函式引數和返回值需要手動釋放...