如果在申請動態記憶體時找不到足夠大的記憶體塊,malloc和new將返回null指標,宣告記憶體申請失敗。通常有三種方式處理「記憶體耗盡」問題。
(1)判斷指標是否為null,如果是則馬上用return語句終止本函式。例如:
void func(void)…}
(2)判斷指標是否為null,如果是則馬上用exit(1)終止整個程式的執行。例如:
void func(void)…}
(3)為new和malloc設定異常處理函式。例如visual c++可以用_set_new_hander函式為new設定使用者自己定義的異常處理函式,也可以讓malloc享用與new相同的異常處理函式。詳細內容請參考c++使用手冊。
上述(1)(2)方式使用最普遍。如果乙個函式內有多處需要申請動態記憶體,那麼方式(1)就顯得力不從心(釋放記憶體很麻煩),應該用方式(2)來處理。
很多人不忍心用exit(1),問:「不編寫出錯處理程式,讓作業系統自己解決行不行?」
不行。如果發生「記憶體耗盡」這樣的事情,一般說來應用程式已經無藥可救。如果不用exit(1) 把壞程式殺死,它可能會害死作業系統。道理如同:如果不把歹徒擊斃,歹徒在老死之前會犯下更多的罪。
有乙個很重要的現象要告訴大家。對於32位以上的應用程式而言,無論怎樣使用malloc與new,幾乎不可能導致「記憶體耗盡」。我在windows 98下用visual c++編寫了測試程式,見示例7-9。這個程式會無休止地執行下去,根本不會終止。因為32位作業系統支援「虛存」,記憶體用完了,自動用硬碟空間頂替。我只聽到硬碟嘎吱嘎吱地響,window 98已經累得對鍵盤、滑鼠毫無反應。
我可以得出這麼乙個結論:對於32位以上的應用程式,「記憶體耗盡」錯誤處理程式毫無用處。這下可把unix和windows程式設計師們樂壞了:反正錯誤處理程式不起作用,我就不寫了,省了很多麻煩。
void main(void)
}示例7-9試圖耗盡作業系統的記憶體
記憶體耗盡怎麼辦?
如果在申請動態記憶體時找不到足夠大的記憶體塊,malloc和new將返回null指標,宣告記憶體申請失敗。通常有三種方式處理 記憶體耗盡 問題。1 判斷指標是否為null,如果是則馬上用return語句終止本函式。例如 void func void 2 判斷指標是否為null,如果是則馬上用exit...
7 9 記憶體耗盡怎麼辦?
如果在申請動態記憶體時找不到足夠大的記憶體塊,malloc 和new 將返回null 指標,宣告記憶體申請失敗。通常有三種方式處理 記憶體耗盡 問題。1 判斷指標是否為null,如果是則馬上用return 語句終止本函式。例如 void func void 2 判斷指標是否為null,如果是則馬上用...
怎麼辦,怎麼辦?
我在一家軟體公司做程式設計師,也有一年多,我是做.net方向的,公司活還可以,就是工資給的少。本來想在工作半年的時候提出加薪的要求,可事事難料啊?就在我剛要開口的時候公司發生了變動。收購 我公司被乙個集團收購了,在收購的這段期間我們公司真是損兵折將啊,走了一大批人,其中包括我們原來的專案經理。這樣一...