operator new丟擲異常的處理

2021-04-22 05:45:00 字數 1770 閱讀 8314

operator new在無法完成記憶體分配請求時會丟擲異常(以前的做法一般是返回0,一些舊一點的編譯器還這麼做,我們也可以恢復到舊的編譯器方式

例如:char * lp = new char[10000000];

如果分配失敗,在舊的編譯器下會返回0,但是在新的編譯器下會丟擲異常std::bad_alloc

我們也可以用在新的編譯器下不丟擲異常而返回0

char * lp = new(nothroe) char[10000000];

但是更好的解決方式是使用set_new_handler,它在標頭檔案中的定義大概如下:

typedef void (*new_handler)();

new_handler set_new_handler(new_handler p) throw();

可以看到,new_handler是乙個自定義的函式指標型別,它指向乙個沒有輸入引數也沒有返回值的函式。set_new_handler則是乙個輸入並返回new_handler型別的函式。

set_new_handler的輸入引數是operator new分配記憶體失敗時要呼叫的出錯處理函式的指標,返回值是set_new_handler沒呼叫之前就已經在起作用的舊的出錯處理函式的指標。

可以象下面這樣使用set_new_handler:

// functin to call if operator new can't allocate enough memory

void nomorememory()

int main()

卸除new-handler。也就是傳遞空指標給set_new_handler。沒有安裝new-handler,operator new分配記憶體不成功時就會丟擲乙個標準的std::bad_alloc型別的異常。

更一般而好的處理方式是繼承模板類

template// 提供類set_new_handler支援的

class newhandlersupport ;

template

new_handler newhandlersupport::set_new_handler(new_handler p)

template

void * newhandlersupport::operator new(size_t size)

catch (std::bad_alloc&)

std::set_new_handler(globalhandler);

return memory;

}// this sets each currenthandler to 0

template

new_handler newhandlersupport::currenthandler;

有了這個模板類,對類x加上set_new_handler功能就很簡單了:只要讓x從newhandlersupport繼承:

// note inheritance from mixin base class template. (see

// my article on counting objects for information on why

// private inheritance might be preferable here.)

class x: public newhandlersupport; // set_new_handler or operator new

以上是讀 effective c++ 的筆記

java throw丟擲異常

1 throws關鍵字通常被應用在宣告方法時,用來指定可能丟擲的異常。多個異常可以使用逗號隔開。當在主函式中呼叫該方法時,如果發生異常,就會將異常拋給指定異常物件。如下面例子所示 public class shoot public static void main string args catch...

python丟擲異常

1 python 使用 raise 語句丟擲乙個指定的異常。raise nameerror hithere traceback most recent call last file line 1,in module raise nameerror hithere nameerror hithere ...

自行丟擲異常

如果throw語句丟擲的異常是checked異常,則該throw語句要麼處於try塊裡,顯式捕獲該異常,要麼放在乙個帶throws宣告丟擲的方法中,即把該異常交給該方法的呼叫者處理 如果throw語句丟擲的異常是runtime異常,既可以顯式捕獲該異常,也可以不用理會該異常,把該異常交給呼叫者處理。...