8.寫operator new 和 operator delete 時要遵循常規。
operator new要與系統缺省的operator new ?操作一致。即有正確的返回值,內存不夠時要調用出錯處理函數,處理好0字節內存請求的情況,避免隱藏標準形式的new。
new會多次的嘗試分配內存,寄希望與每次失敗后執行的出錯處理函數能釋放其他地方的內存以供使用。只有在出錯處理函數指針為空的情況下,new才拋出異常。new在請求分配0字節內存時也要返回一個合法的指針,一般情況下,c++會將0字節認為為一個字節大小。
operator new會經常被派生類調用,所以要么在派生類中重載一個新的new,或者在基類中new函數中做一些判斷,因為派生類的大小很可能與基類大小不同,而且sizeof()大小為0的情況下會返回值為1。
如果想要控制基于類的數組的內存分配,必須實現operator new[] 。
對于operator delete ,更加簡單一點。對于空指針的刪除永遠是安全的。剩下的只要考慮增加繼承支持就行了。
9.避免隱藏標準形式的new。
內部聲明的名稱會隱藏掉外部范圍相同的名稱。如果類中只重載了操作符new,如下:
~~~
static void* operator new (size_t size,new_handler p);//p為出錯處理函數
~~~
而在新建對象時,
~~~
B *b1 = new (noMoreMemory)B;
B *b2 = new B;
~~~
前者正確,但后者就錯誤了,錯誤原因為此函數隱藏了 operator new,即使對于后者,其參數與函數參數不相符合,其錯誤提示即參數不符。
解決的方法有兩種:
重載標準new調用方式operator new。
對每一個增加到operator new中的參數提供缺省值 如?
~~~
static void* operator new (size_t size,new_handler p = 0);
~~~