看板 C_and_CPP 關於我們 聯絡資訊
用 new(std::nothrow) 好像解決不了問題耶 因為使用其他函式庫時,一樣得處理 new 失敗的問題 舉例來說 #include <new> #include <string> int main() { // 要兩個 buffer,長度皆為 1024 char* buffer1 = new(std::nothrow) char[1024]; string buffer2; buffer2.reserve[1024]; // 要處理 buffer1 new 失敗的問題嗎? // 如果要處理 buffer1 new 失敗,則 buffer2 new 失敗的情況也要處理 // 不然 buffer2 內部 new 失敗,程式一樣會當掉 // 可是 string 內部是 throw exception // 那 buffer1 寫 new(std::nothrow) 就沒意義了 // 反正 buffer2 還是得處理 std::bad_alloc exception delete[] buffer1; return 0; } 這問題也不可能說不用函式庫就能解決 寫 windows 程式還是很難不用 windows API 吧? ※ 引述《jerohands (這就是人生啊)》之銘言: : 舉一個我慣用的寫法: : #include <new> : ex. : int *p = new(std::nothrow) int [10]; : if(p == NULL) : { : // error handling : } : 希望對你有幫助。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.170.53.62
os653:直接 catch 的問題是沒啥意義,new 失敗了很多事情都沒辦法 06/09 11:53
os653:處理了吧?就像 IE 的例子,在極端情況下,你也沒辦法跳出個 06/09 11:54
os653:錯誤視窗跟使用者說你要不到記憶體,因為視窗根本出不來 06/09 11:55
COLDTURNIP:1. 重新 new,一直到成功為止 06/09 12:30
※ 編輯: os653 來自: 218.170.53.62 (06/09 12:32)
COLDTURNIP:2. 事前就挖出來(pool) 06/09 12:31
os653:重新 new 到成功好像會導致程式沒有回應耶? 06/09 12:34
os653:事前挖出來是指在程式一開始就先把所有記憶體要好嗎?不懂.. 06/09 12:35
os653:大概懂了,windows API 本來就不會 throw exception 嘛 ... 06/09 12:56
freelancer:請參看Effective C++ item 7,C++予許用 06/09 13:09
freelancer:typedef void (*new_hnalder)(); 06/09 13:09
freelancer:new_handler set_new_handler(new_handler p) throw(); 06/09 13:10
freelancer:註冊自已的function 來處理new 失敗的情況 06/09 13:10
littleshan:你可以 catch exception 然後釋放資源 06/09 13:13
littleshan:因為釋放資源的操作通常會設計成 nothrow 06/09 13:13
littleshan:所以可以讓你的程式繼續執行下去 06/09 13:13
littleshan:如果要跳出錯誤訊息,可以在程式啟動時就先建立視窗 06/09 13:15
littleshan:真正發生 exception 時再顯示出來,以避免額外的配置 06/09 13:16
wowtiger:SEH or VEH 06/16 01:40