當寫出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至今尚未啟動的執...