C 中令人混淆的3個new和delete

2021-09-30 08:13:48 字數 1705 閱讀 8532

在深入學習c++的過程中遇到3個new和delete讓我十分迷惑,經過學習,有了點初步理解的感覺。總結如下

c++中,記憶體分配和物件構造緊密糾纏,就像物件析構和記憶體**一樣。使用new 表示式的時候,分配記憶體,並在該記憶體中構造乙個物件,使用delete的時候,呼叫析構函式撤銷物件,並將物件所用記憶體返還給系統。

c++提供了一下兩種方法來分配和釋放未構造的原始記憶體:

1)allocator類的allocate 和 deallocate成員函式

2)標準庫中的 operator new 和 operator delete。

c++還提供了在原始未構造的記憶體中構造和析構物件:

1)allocator類的construct 和 destroy成員函式

2)定位new表示式,接收指向未構造的記憶體的指標,並在該空間中初始化乙個物件或陣列。

3)直接呼叫物件的析構函式撤銷物件。

1. new 表示式 和 delete 表示式

就是我們最常用的。比如:a* a = new a();  delete a; 這中用法很常見。

但是很少人了解裡面的機制。

其實,當使用new的時候,發生了3個步驟:

1) 呼叫 operator new 的標準庫函式,分配足夠大的原始未型別化的記憶體。(沒有進行構造)

2) 執行該型別的建構函式

3) 返回指向新分配並構造的物件指標。

delete是發生了2步:呼叫析構函式,釋放記憶體空間。

2. operator new 和 operator delete

operator new 和 operator delete的設計意圖是供表示式new 和 delete 使用。但是他們通常是標準庫中可呼叫的函式。可以使用他們獲得 未構造 記憶體空間。他們有點類似與allocator類的 allocate 和 deallocate成員函式。

operator new 和 operator delete有兩個過載版本:

void *operator new(size_t);

void *operator new(size_t);

void *operator delete(void*);

void *operator delete(void*);

他們在void*指標,而不是型別化指標上操作。並且只是分配記憶體空間,並不初始化。

3 placement new (翻譯成 定位new表示式)

定位new表示式在已經分配了的記憶體中初始化了乙個物件。它並不分配記憶體。相反,它接收指向已經分配的但是沒有構造的記憶體指標,並在該記憶體中初始化乙個物件。 它能使我們在特定的,預分配的記憶體位址構造乙個物件。

定位new表示式是:

new (place_address) type

new (place_address) type (initializer-list)

其中place_address必須是個指標,nitializer-list是初始化列表。

可以使用定位new表示式代替allocator 裡的 construct函式。定位new表示式初始化乙個物件的時候,可以使用任何建構函式(constructor只能使用 拷貝建構函式),並且直接建立物件。

例如:new(sp)  string(b,e);

alloc.construct(sp+1,string(b,e));

相對於 定位new表示式 析構操作的是 顯示的呼叫析構函式。顯示呼叫析構函式只是清除物件本身,但是並沒有釋放物件所占用的記憶體。

shell中3個易混淆的符號用法

shell中3個易混淆的符號用法 string 單引號 single quote 被單引號用括住的內容,將被視為單一字串。在引號內的代表變數的 符號,沒有作用,也就是說,他被視為一般符號處理,防止任何變數替換。heyyou homeecho heyyou we get heyyou string 雙...

C中malloc和C 中的new的區別

malloc和new有以下區別 1 new,delete是操作符,只能在c 中使用 2 malloc,free是函式,可以覆蓋,c,c 中都可以使用 3 new可以呼叫物件的建構函式,對應的delete呼叫相應的析構函式 4 malloc僅僅分配記憶體,free僅僅 記憶體,並不執行構造和析構函式 ...

c 中,new 和 override 的區別

一 在c 中,new這個關鍵字使用頻率非常高,主要有3個功能 a 作為運算子用來建立乙個物件和呼叫建構函式。b 作為修飾符。c 用於在泛型宣告中約束可能用作型別引數的引數的型別。在本文中,只具體介紹new作為修飾符的作用,在用作修飾符時,new關鍵字可以在派生類中隱藏基類的方法,也就說在使用派生類的...