Re: [問題] 有需要檢查 new 失敗的情形嗎?

看板C_and_CPP (C/C++)作者 (allstar)時間16年前 (2009/06/09 11:52), 編輯推噓4(4014)
留言18則, 5人參與, 最新討論串3/5 (看更多)
用 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

06/09 11:53, , 1F
直接 catch 的問題是沒啥意義,new 失敗了很多事情都沒辦法
06/09 11:53, 1F

06/09 11:54, , 2F
處理了吧?就像 IE 的例子,在極端情況下,你也沒辦法跳出個
06/09 11:54, 2F

06/09 11:55, , 3F
錯誤視窗跟使用者說你要不到記憶體,因為視窗根本出不來
06/09 11:55, 3F

06/09 12:30, , 4F
1. 重新 new,一直到成功為止
06/09 12:30, 4F
※ 編輯: os653 來自: 218.170.53.62 (06/09 12:32)

06/09 12:31, , 5F
2. 事前就挖出來(pool)
06/09 12:31, 5F

06/09 12:34, , 6F
重新 new 到成功好像會導致程式沒有回應耶?
06/09 12:34, 6F

06/09 12:35, , 7F
事前挖出來是指在程式一開始就先把所有記憶體要好嗎?不懂..
06/09 12:35, 7F

06/09 12:56, , 8F
大概懂了,windows API 本來就不會 throw exception 嘛 ...
06/09 12:56, 8F

06/09 13:09, , 9F
請參看Effective C++ item 7,C++予許用
06/09 13:09, 9F

06/09 13:09, , 10F
typedef void (*new_hnalder)();
06/09 13:09, 10F

06/09 13:10, , 11F
new_handler set_new_handler(new_handler p) throw();
06/09 13:10, 11F

06/09 13:10, , 12F
註冊自已的function 來處理new 失敗的情況
06/09 13:10, 12F

06/09 13:13, , 13F
你可以 catch exception 然後釋放資源
06/09 13:13, 13F

06/09 13:13, , 14F
因為釋放資源的操作通常會設計成 nothrow
06/09 13:13, 14F

06/09 13:13, , 15F
所以可以讓你的程式繼續執行下去
06/09 13:13, 15F

06/09 13:15, , 16F
如果要跳出錯誤訊息,可以在程式啟動時就先建立視窗
06/09 13:15, 16F

06/09 13:16, , 17F
真正發生 exception 時再顯示出來,以避免額外的配置
06/09 13:16, 17F

06/16 01:40, , 18F
SEH or VEH
06/16 01:40, 18F
文章代碼(AID): #1ABTngPu (C_and_CPP)
文章代碼(AID): #1ABTngPu (C_and_CPP)