2014-01-08 15 views
6

プログラムをメモリ不足にすると、ユーザーに警告し、おそらく警告を出して、ほんの一部を解放しようとします。状況を表示するために必要なGUIエンティティを事前に割り当てることができますが、私の懸念は、この状況ではファイルのオープンや書き込みなど、より基本的な操作がcstdioを使用するということです。「メモリ不足」エラーをメモリに書き込まないでファイルに書き込む?

私の質問はです。プログラムがもはや動的にメモリを割り当てることができない場合は、まだcstdioを使用することはできますか?ファイルを開いたままにしたり、バッファを使用しないように設定したりするなど、必要な特別な対策はありますか? cstringの機能は引き続き機能しますか?このようなシナリオで知るべき他の障害の可能性はありますか?

(ユーザに警告すると、この場合には豪華であり、主な目的は、そのために、ユーザに警告し、cstdioを有する関連データを救出しようとし、その後、ファイルにエラーを記録することである)

+3

それは遅すぎるかもしれないが、あなたは十分**連続した領域を割り当てることができない場合でも、同じエラーを持っている**ので、他の操作は1つも割り当て要求あれば動作する可能性失敗しました。空きメモリがスレッショルド**未満になると(このチェックを実行する頻度は、割り当てパターンによって異なります)、ユーザー(およびログ)に警告することをお勧めします。 –

+0

今、メモリはあらかじめプールされておらず、必要に応じてOSから取得したばかりです。 (すぐにそれを変更する必要があります)。メモリの割り当て方法は、ロギング/警告後に割り当てを再試行します。プログラムがそれ以降にさらにメモリを割り当てようとしない限り(またクラッシュを引き起こす)、シナリオが変更されない限り、回復することができます(うまくいけば!) –

+8

私が取り組んだゲームの中でこれを解決しようとした方法の1つは、例外ハンドラを登録するときにバッファを割り当てることでした。例外が発生した場合、バッファを解放し、ハンドラが書き出す必要なデータ。 –

答えて

1

短いですあなたの質問に対する答えは "おそらく"ではありません(この回答を参照:https://stackoverflow.com/a/6743056/789491)。動的割り当てを使用しないオープンソースのsnprintf()のバージョンがあります。私はあなたのファイルに書き込むためにmmap(2)を使用したいと思います。

私はcstdioを使用する理由を推測していますが、すでにcstdioを使用しています。それで、私はこの解決策を今のところ高水準に保ちます。

この場合、最初はエラーメッセージと回復データ(la @ Retired-Ninja)を格納するのに十分な大きさのバッファを割り当てます。私はバッファを少なくとも1ページのサイズにするつもりだが(私のLinuxボックスでは4096バイト)。私はまた、書き込みたいログファイルを開き、私が望むバッファサイズでそのファイルをmmap(2)します。

私のメモリ不足の例外ハンドラでは、まずバッファを解放して(動作するメモリを確保するため)、mallocのないバージョンのsnprintfを使用してmmap'dファイルにエラーメッセージを作成します。私は次にファイルをfsyncします(fsyncソースコードをトレースしていないか、どれくらいの量のメモリを割り当てるかはcstdioより小さくする必要があります)。私はその後、ファイルを閉じて、あなたが望むものを何でも(GUI処理など)し、終了します。

私のプログラムが正常に終了したら、私はmmapで作成したログファイルを削除するだけです。

保存しようとしているデータの量が多い(たとえばページよりも大きい)場合は、1ページのバッファを割り当てて、一度に1ページずつログファイルを作成するだけです。あるいは、あなたはこのようなことをすることができますhttps://stackoverflow.com/a/8704032/789491

HTH。あなたがそのエラーを取得すると

--Jason

関連する問題