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異常,既可以顯式捕獲該異常,也可以不用理會該異常,把該異常交給呼叫者處理。...