C new 的六種過載形式

2021-06-26 01:59:28 字數 2933 閱讀 1375

當寫出p = new p();這樣的**的時候, 實際上有兩步操作, 首先分配記憶體,然後在分配好的記憶體之上初始化類成員.第

二步是有建構函式完成的, 第一步就是new函式的工

作.全域性的new有六種過載形式,

void *operator new(std::size_t count)

throw(std::bad_alloc); 

//一般的版本

void *operator new(std::size_t count, 

//相容早版本的new

const std::nothrow_t&) throw(); 

//記憶體分配失敗不會丟擲異常

void *operator new(std::size_t count, void *ptr) throw();

//placement版本

void *operator new(std::size_t count) 

//throw(std::bad_alloc);

void *operator new(std::size_t count, 

//const std::nothrow_t&) throw();

void *operator new(std::size_t count, void *ptr) throw();

所以, 剛才的用法, 就是使用new函式的一種過載形式.

如果a這個物件以同樣實行過載了new函式的化, 作為成員函式

會被優先呼叫.

c++的各種new簡介

1.new t

第一種new最簡單,呼叫類的(如果過載了的話)或者全域性的operator new分配空間,然後用

型別後面列的引數來呼叫建構函式,用法是

new typename(initial_args_list). 如果沒有引數,括號一般可以省略.例如

int *p=new int;

int *p=new int(10);

int *p=new foo("hello");

通過呼叫delete來銷毀:

delete p;

2. new t

這種new用來建立乙個動態的物件陣列,他會呼叫物件的operator new來分配記憶體(如果

沒有則呼叫operator new,搜尋順序同上),然後呼叫物件的預設建構函式初始化每個物件

用法:new typename[num_of_objects];

例如int *p= new int[10];

銷毀時使用operator delete

3.new()t 和new() t

這是個帶引數的new,這種形式的new會呼叫operator new(size_t,othertype)來分配記憶體

這裡的othertype要和new括號裡的引數的型別相容,

這種語法通常用來在某個特定的位址構件物件,稱為placement new,前提是operator new

(size_t,void*)已經定義,通常編譯器已經提供了乙個實現,包含標頭檔案即可,這個

實現只是簡單的把引數的指定的位址返回,因而new()運算子就會在括號裡的位址上建立

物件需要說明的是,第二個引數不是一定要是void*,可以識別的合法型別,這時候由c++的過載

機制來決定呼叫那個operator new

當然,我們可以提供自己的operator new(size_,type),來決定new的行為,比如

char data[1000][sizeof(foo)];

inline void* operator new(size_t ,int n)

就可以使用這樣有趣的語法來建立物件:

foo *p=new(6) foo(); //把物件建立在data的第六個單元上

的確很有意思

標準庫還提供了乙個nothrow的實現:

void* operator new(std::size_t, const std::nothrow_t&) throw();

void* operator new(std::size_t, const std::nothrow_t&) throw();

就可以實現呼叫new失敗時不丟擲異常

new(nothrow) int(10);

// nothrow 是std::nothrow_t的乙個例項

placement new 建立的物件不能直接delete來銷毀,而是要呼叫物件的析夠函式來銷毀對

象,至於物件所佔的記憶體如何處理,要看這塊記憶體的具體**

4. operator new(size_t)

這個的運算子分配引數指定大小的記憶體並返回首位址,可以為自定義的類過載這個運算子,

方法就是在類裡面宣告加上

void *operator new(size_t size)

無論是否宣告,類裡面過載的各種operator new和operator delete都是具有static屬性的

一般不需要直接呼叫operator new,除非直接分配原始記憶體(這一點類似於c的malloc)

在衝突的情況下要呼叫全域性的operator加上::作用域運算子:

::operator new(1000); // 分配1000個位元組

返回的記憶體需要**的話,呼叫對應的operator delete

5.operator new(size_t)

這個也是分配記憶體,,只不過是專門針對陣列,也就是new t這種形式,當然,需要時可以

顯式呼叫

6.operator new(size_t size, othertype other_value)

和operator new(size_t size, othertype other_value)

參見上面的new()

需要強調的是,new用來建立物件並分配記憶體,它的行為是不可改變的,可以改變的是各種

operator new,我們就可以通過過載operator new來實現我們的記憶體分配方案.

new有六種過載形式

當寫出 p new p 這樣的 的時候,實際上有兩步操作,首先分配記憶體,然後在分配好的記憶體之上初始化類成員.第二步是有建構函式完成的,第一步就是new函式的工作.全域性的new有六種過載形式,void operator new std size t count throw std bad all...

qml multitouch的六種訊號

1.canceled list touchpoints 當由於另一項竊取了觸控事件處理而取消了新的觸控事件時,將發出此訊號。此訊號用於高階用途 當有多個multipointtoucharea處理輸入時,或者在乙個閃爍的內部有乙個multipointtoucharea時,它非常有用。在後一種情況下,如...

Thread的六種狀態

執行緒共有6種狀態 在某一時刻只能是這6種狀態之一。這些狀態由thread.state這個列舉型別表示,並且可以通過getstate 方法獲得當前具體的狀態型別。包括 new,runnable,blocked,waiting,timed waiting,terminatmed new至今尚未啟動的執...