C++new失败后如何处理

兩個可能性: new 失敗會 throw bad_alloc, 或傳回 0.

這兩個可能性會導致兩個結果. 如果 new 拋 bad_alloc, 所有已經成功建構的物件 (如 base class, 其它成員物件) 都會解構. 尚未建構的物件不會建構. Caaa 物件也不會存在.

如果 new 傳回 0, 你會有一個完整的物件, 但其內部的成員資料的完整性是個問題 ('total' 不是 0, 但 'ptr' 是 0).

你可以在 initialization list 裡抓成員所拋的 exceptions:

  Caaa::Caaa(int num, int *p)
  try : total(num), ptr(new int[num])
  {
    // 正常運作的 body
  }
  catch (...)
  {
    // exception handler
  }

既使 catch-block 沒有 throw, 當跑到 constructor 的 catch-block 結束時, 原本的 exception 會自動重拋.
posted @ 2011-04-17 20:28  hailong  阅读(679)  评论(1编辑  收藏  举报