過載new和delete的一些規則

2021-07-07 08:28:51 字數 3340 閱讀 4691

參考:《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...