メモリ不足ネタ, 続きます.
> [3320] newの失敗の検出方法 by もか氏
> >調べた限りでは、
> >NULLに統一したくてもBCC551ではnothrowが効かないことがある。
> >VC6では operator delete( size_t, nothrow_t& ); が未宣言。
> >VC7xではnewヘッダをインクルードするかしないかで動作が変わる。
> >set_new_handler()を使う場合もstaticなオブジェクトが、
> >それより先にnewを実行するかもしれない。
>
> 結局この問題にたどり着く.
つまり, デフォルトの new 演算子を信用すべからずってコトだと気づく.
> ・標準 <vector> ライブラリで出来るところはそれでやる.
> ・文字列操作とかバッファリング操作とか, パフォーマンスが必要な場合は, string とか 自前の CMemory クラスとか, それなりのものを使う.
>
> で, 標準ライブラリでは new の失敗時に何かの例外を発行してくれることを祈りながら,
> その例外を上のほうのクラスで catch( ... ) ブロックで拾う... ( CProcess とか? )
しかし vector<T*> 型を T** 型として扱う部分にも対応できないといけない. そのためには CMem をあっさり取りやめて, CMemory の内装を vector<char> あたりで統一するか, CMem をテンプレート化して, template<> CMem<void*> 型を提供するかのどちらかが必要か…
標準の型に縛られない自由さという点で後者が勝るけれど, 下手に作った道具よりも標準ライブラリの処理能力のほうが上という面では, 前者が勝る…
> >SetUnhandledExceptionFilterで例外ハンドラを設定しておいて、
> >そこで無理矢理保存を行う
>
> ああ, そういえば既出でしたか... やっと意味がわかりました;;
例外を投げない可能性のある new を使った時点でアウトだから…
CSakuraObjectBase(仮名) みたいなクラスに new, delete 一式をユーザー定義しておいて, そのクラスをすべてのクラスの基底とすれば処理系依存で悩むことはなくなりそうです.
# 基底クラスの名付けで悩んでしまいます;;