C 中的new與delete總結

2021-09-08 09:46:49 字數 2247 閱讀 7651

標準庫提供的global operator new,在全域性名字空間中定義:

void* operator new (std::size_t size); //丟擲異常的版本

void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept; //不丟擲異常的版本,記憶體不足則返回nullptr

void* operator new (std::size_t size, void* ptr) noexcept; //placement new,僅僅返回ptr值,未作記憶體分配

對應的global operator delete:

void operator delete (void* ptr) noexcept;

void operator delete (void* ptr, const std::nothrow_t& nothrow_constant) noexcept;

void operator delete (void* ptr, void* voidptr2) noexcept;//本函式未做任何事情

標準版:標準版的operator new只有乙個size_t型別的引數;標準版的operator delete只有 void*型別引數;另外,operator delete還有乙個特別成員版:有void *型別引數和size_t型別引數(只可在class中定義)。若類中同時定義了這兩種operator delete,則優先使用前者。

非標準版:effective c++中稱之為placement版,並指出其多義性,而c++標準中將placement語義留給了上述提到標準庫的第三個函式。非標準版的operator new可以有除了第乙個size_t引數以外的其他引數,原型形式為:void* operator new(std::size_t size, type1 arg1, type2 arg2...); 通過new操作符間接呼叫的形式為: new(arg1, arg2, ...)classx; 非標準版的operator delete除了有第乙個void*型別的引數還有額外的引數,其原型形式為:void* operator delete(void *ptr, type1 arg1, type2 arg2 ...); 非標準版的operator delete會在相應的operator new呼叫後物件的建構函式發生異常時由編譯器呼叫。

注:關於operator delete的「特別成員版」。若類中同時有標準形式的operator delete作為成員,則delete操作符優先使用標準形式的operator delete,即時在異常丟擲(下文會解釋這是什麼異常情況)時也是如此。另外,非標準版的operator new並沒有與之引數對應的「特別成員版」

不同形式的operator new與operator delete:

void* operator new (std::size_t size); //全域性標準版operator new

void operator delete(void* ptr);//全域性標準版operator delete

class a;

標準版:void* operator new(std::size_t size)可與兩種operator delete對應,即void operator delete(void* ptr)或void operator delete(void*ptr, size_t)。且無論在正常情況下,還是異常情況下,c++優先使用第一種operator delete

非標準版:void* operator new(std::size_t size, ...)與void operator delete(void* ptr, ...)對應。未發生異常時,c++編譯器呼叫operator new(標準版或非標準版依據new操作符是否傳遞額外引數而定)分配記憶體,呼叫標準版的operator delete(無論該記憶體是否通過標準版的operator new)釋放記憶體。異常發生時(operator new成功呼叫,但呼叫物件建構函式時發生異常),編譯器會呼叫與operator new引數對應的operator delete版本,若未找到,則不會呼叫其他形式的operator delete

參考:

operator new在c++中的各種寫法 

c++過載operator new和operator delete 

c++中的new和delete 

033_深入c++的new 

c 中new與delete的過載

對於有一定程式設計基礎的人來說,new與delete一定會非常的熟悉,知道在使用的過程中 new 先分配memory 記憶體 再呼叫ctor 建構函式 而delete是先呼叫dtor 析構函式 再釋放memory。int p new int 10 int pa new int 10 new用來動態建...

C 中的new語義與delete

籠統地說,c 中的new就是申請一塊記憶體,但是對於不同型別的資料,要注意的點也不同。new與基本資料型別,如int new與陣列 new與物件 new的替換語義 new最好與智慧型指標配合使用,防止記憶體洩漏 申請乙個int型資料a int a newint 2 delete a 申請乙個大小為1...

C 中new與delete的用法

最近在學習c 的過程中,發現指標以及new和delete的使用遍布全書,可見其重要性。在學習了乙個階段之後,總結一下new和delete的用法,指標還沒有摸透,待日後總結。new和delete是c 中的兩個操作符,new用於給單個物件或者陣列,結構等分配記憶體,在記憶體使用完後,用delete進行釋...