c new的三種形態

2021-07-04 11:58:15 字數 1747 閱讀 8935

(1)new operator

new的第一種形態是new operator,它是語言內建的,不能過載。new operator完成以下三件工作:

1. allocate memory for this object.

2. call constructor to init that memory.

3. return the pointer of this object.

例如:string *pstr = new string(「memory management」);

它實際完成以下三件事:

// 1. 為string物件分配raw記憶體

void *memroy = operator new( sizeof(string) );

// 2. 呼叫建構函式初始化記憶體中的物件

call string::string() on memory

// 3. 獲得物件指標

string *pstr = static_cast(memory);

第1步申請記憶體,通過operator new完成;第2步在指定的記憶體上呼叫建構函式初始化物件,通過placement new完成。這便是new的另外兩種形態。

(2)operator new

operator new是普通操作符,和加減乘除操作符的地位一樣,可以過載。

預設情況下,operator new嘗試從堆上申請記憶體,如果成功則返回記憶體指標,如果失敗會呼叫new_handler,然後繼續重複前面過程,直到丟擲異常(bad_alloc)為止。

operator new函式原型:void * operator new(size_t size);

operator new可以過載,可以為某個類單獨過載,也可以全域性過載(將改變所有operator new的行為方式)。如果過載了operator new,應該過載operator delete。

(3)placement new

(定位new)在已分配的原始記憶體中初始化乙個物件。它與new的其他版本的不同之處在於,它不分配記憶體。相反,它接受指向已分配但未構造的記憶體的指標,並在該記憶體中初始化乙個物件。placement new表示式能夠在特定的、預分配的記憶體位址上構造乙個物件。

placement new是c++標準庫的一部分,使用時需包含標頭檔案。

void *s = operator

new( sizeof

(a) );

a *p = (a*)s;

new(p) a(2013); //

p->a::a(2013);

//processing code…

p->~a();

如果顯示的呼叫placement new,也應該顯示的呼叫與之對應的placement delete:p->~a();。這份工作本來應該由編譯器自動完成:在使用new operator時,編譯器會自動生成呼叫placement new的**。所以,除非特別必要,不要直接使用placement new。只有當預設的new operator對記憶體的管理不能滿足需要,希望自己手動管理記憶體時,才考慮使用placement new。就像stl中的allocator一樣,它借助placement new來實現更靈活有效的記憶體管理。

【學習資料】 《編寫高質量** c++》 《thinking in c++》

c new三種用法

前幾天去家公司面試,有一道這樣的題 寫出c 中new關鍵字的三種用法,思前想後挖空心思也只想出了兩種用法,回來查了下msdn,還真是有第三種用法 用於在泛型宣告中約束可能用作型別引數的引數的型別,這是在framework 2.0 中定義泛行時才會使用到的,自己對c 2.0 中的支援還只是粗通皮毛,怪...

三種新的職業形態和方式

在地青年 一種全新的工作機會,也是一種把工作和生活融合的可能 為什麼選擇在地青年 新工匠 找到一門你獨特的手藝,成為乙個手藝人也越來越成為乙個好的選擇 社會企業與工藝 可以考慮加入比較流行的社會企業,或者在你的企業做社會效益的事 總的來說以上介紹的三種可能的職業形態和方式屬於小眾範圍,大部分的人是無...

問 shader的三種形態以及渲染路徑的不同

shader的三種形態是不是針對顯示卡的不同而設計區分的?乙個shader裡面能不能同時使用三種形態來編寫呢?unity中的renderingpath vertexlit,forward,deferred 跟shader的三種形態有什麼關係?在shader中存在多個適應不同渲染路徑的pass.這裡說...