• 締切済み

newの失敗

あなた(又は周辺で)は、newの失敗に対してどんな方法を使っていますか。(オーバーライドした場合を除く) 教えてください。

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

標準ライブラリが提供しているnewにもいくつかありますが、普通のnewならstd::bad_allocまたはstd::exceptionを捕捉するしかありません。set_new_handlerでどうにかできるようなハンドラを登録することは実際にはあまりありませんね。 std::nothrowを引数にとるnewの場合は、式の評価結果は0かどうかを調べるしかありませんし、ポインタを引数にとるものはそもそも失敗しません。 それから、配列形式のnewはstd::vectorで代用するのでまず使いません。 newの失敗というよりは、例外全般に対する安全性は常に考慮に入れておくべきかと思います。

すると、全ての回答が全文表示されます。
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

だいたい例外のキャッチですけど、コンストラクタの中でnewするときは「ここで例外発生したらどこまでちゃんとリワインドされるんだっけ?」といつも迷います。(いつまでたっても覚えない・・・)

wsp
質問者

補足

リワインドとは何ですか。

すると、全ての回答が全文表示されます。
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

newが失敗すると bad_allocがよばれますから、それをキャッチするのが一般的ではないでしょうか。 あとはstd::auto_ptrを使用するのも手ですね。 でもやはりベストな方法はオーバーロード、或いはオーバーライドして 自分でメモリ管理する事でしょうね。

参考URL:
http://www.doumo.jp/postgretips/tips.jsp?tips=78
wsp
質問者

補足

set_new_handler(0)でNULLを返すようにすると、bad_alloc例外で書かれたコードは書き直さないといけないのですか?

すると、全ての回答が全文表示されます。

関連するQ&A