參考:《effective c++》
1.記憶體分配失敗時呼叫new_handler
關於new_handler參考:
2.處理0記憶體的情況(一種處理方案是將0位元組記憶體請求當作1位元組來分配)
演示
#include
#include
void *operator
new(size_t size);
}void outofmem()
int main()
從上面的**我們觀察到:只有幾種方法可以終結new_handler的呼叫:
1.new分配記憶體成功並返回
2.new_handler為空,直接丟擲std::bad_alloc異常
3.new_handler所指向的函式中包含abort()或exit()等直接終止程式執行的函式。
4.其他……
*過載new和delete的乙個重要原因是要優化某個物件的記憶體分配。為了安全,我們需要檢測分配的大小是否正確。
要注意的是:過載的區域性new和delete都是為本類服務的,而不是本類的派生類
如:
#include
如圖:此時呼叫的是基類的operator new
但是我們都知道,一般派生模擬基類要大。
解決方法
如圖:我們成功地將重任交給了global new
當然,delete同樣也要檢測,若大小不符,就要交給global delete來處理。
疑問:為什麼我們這裡不用檢測分配0位元組記憶體的情況呢?
看個例子:
現在知道為啥不用檢測分配0位元組的情況了吧。
*array new也就是類似void *operator new(size_t size)的new版本,做法就是直接分配size大小一塊記憶體即可。
理由是:我們無法確定元素的大小和要分配的個數。(如:特殊規則1 中講述的,對於派生類,我們無法使用基類的operator new為其分配記憶體;其次,new常常會多分配出一些空間來儲存額外的資訊)
*刪除nullptr是安全的
剛才已經說過,我們沒有方法直接獲取new_handler,沒錯,但是,在vc++的最新庫中已經包含有 get_new_handler 。位於< new > 標頭檔案中。
看圖:
下面是例項:
過載C 的new和delete
過載c c 標準庫的記憶體管理函式 比如malloc,free,operator new,operator delete,operator new,operator delete 時,編譯器會忽視重定義,所以不用擔心鏈結時會產生重定義錯誤。operator new,operator delete,o...
new與delete的過載
include stdafx.h include using namespace std include include new 和delete的過載 new new delete delete 適用於極個別情況需要定製的時候才用的到。一般很少用 宣告可以不加 引數 void operator ne...
C 記憶體過載new和delete方法
一 過載的原因 用new建立動態物件時會發生兩件事 1 使用operatoe new 為物件分配記憶體 經常是呼叫malloc 2 呼叫建構函式來初始化記憶體。相對應的呼叫delete運算子會 1 首先呼叫析構函式 2 呼叫operator delete 釋放記憶體 經常是呼叫free 使用了new...