11

C ++でメモリが制限された組み込みシステム(Tegra 2)用のアプリケーションを開発しています。私は時々発生するコードのNULL結果を処理していますが、アプリケーションはこれを処理できますnewnew[]

問題は、メモリが完全になくなると、システムがSIGKILLによってプロセスを強制終了することです。newプロセスを強制終了するのではなく、NULLを返すだけでよいとどういうわけか言うことができますか?

4

2 に答える 2

16

使用しているOSの種類はわかりませんが、 Linuxのように日和見的なメモリ割り当てをサポートしているかどうかを確認する必要があります。

有効にすると、次のことが発生する可能性があります(詳細/ソリューションはLinuxカーネルに固有です)。

  1. またははカーネルから有効なアドレスを取得しますnew十分なメモリがなくても、なぜなら...malloc
  2. カーネルは、最初のアクセスの瞬間まで、実際にはメモリを割り当てません。
  3. 「オーバーコミットされた」メモリがすべて使用されている場合、オペレーティングシステムには、関連するプロセスの1つを強制終了する以外にチャンスはありません。(メモリが不足していることをプログラムに伝えるには遅すぎます。)Linuxでは、これはメモリ不足キル(OOM Kill)と呼ばれます。このようなキルは、カーネルメッセージバッファに記録されます。

解決策:メモリのオーバーコミットを無効にします。 echo 2 > /proc/sys/vm/overcommit_memory

于 2012-08-02T15:00:33.890 に答える
1

2つのアイデアが思い浮かびます。

  1. 直接依存するのではなく、独自のメモリ割り当て関数を作成しますnew。組み込みシステムを使用しているとのことですが、アプリケーションでは特別なアロケータが非常に一般的です。アプリケーションをハードウェア上で直接実行していますか、それともエグゼクティブ/ OSレイヤーの下のプロセスで実行していますか?後者の場合、メモリを割り当てるためのシステムAPIが提供されていますか?

  2. C ++をチェックしてset_new_handler、それが役立つかどうかを確認してください。new割り当てが失敗したときに特別な関数が呼び出されるように要求できます。おそらくその関数では、プロセスを強制終了しているものが実行されるのを防ぐためのアクションを実行できます。参照:http ://www.cplusplus.com/reference/std/new/set_new_handler/

于 2012-08-02T14:12:44.860 に答える