30

malloc()の後にNULL(メモリが正常に割り当てられているかどうか)をチェックするのが一般的な方法です。

void *ptr = malloc(10);    
if (ptr != NULL) {  
  // do some thing usefull  
} else {  
 // no memory. safely return/throw ...  
}  

カーネルでメモリオーバーコミットが有効になっている場合、NULLになる可能性はありますか?割り当てごとにNULLを宗教的にチェックする慣行に従う必要がありますか?積極的なオーバーコミットメカニズムにもかかわらず、mallocはNULLを返しますか(値1だと思います)?

実際のところ、Androidカーネルはメモリのオーバーコミットを使用します(値がわからない場合は、それ(オーバーコミット値)とその重要性を知りたいと思います)。Androidのフレームワークソース(C / C ++)コードの一部(サードパーティの可能性があります)は、NULLをチェックせず、割り当て後にbad_allocをキャッチしません。私は何かが足りないのですか?

オーバーコミットメモリに関してSOにはいくつかのスレッドがありますが、それらのどれも私の混乱を解決しませんでした。

編集:積極的なオーバーコミットが採用されている場合、NULLは返されません(仮定1)。使用可能な物理メモリがなく、割り当てられたメモリにアクセスしようとすると(割り当てられたメモリに書き込む)、OOMはプロセスを強制終了し、アプリケーションが強制終了されるまでメモリをアプリケーションに割り当てます(仮定2)。どちらの場合でも、NULLをチェックする必要はありません(メモリが割り当てられるか、プロセスが強制終了されます)。私は私の仮定に正しいですか?
移植性はこの質問の問題ではありません。

4

5 に答える 5

38

はい、それでも。によって返される障害をチェックする必要がありますmalloc。メモリをオーバーコミットする環境では、への前回の呼び出しによってプログラムに割り当てられたアドレススペースの一部に書き込むときに必要な物理ストレージが不足しているため、障害を検出して回復することはできませんmalloc

ただし、malloc従来の環境でが失敗する原因となる問題はこれだけではありません。プログラムのアドレス空間が断片化されたときに特に大きなメモリブロックを要求すると、要求を満たすのに十分な合計物理メモリが存在する可能性がある場合でも、失敗する可能性があります。連続した範囲の空きアドレス空間がないため、malloc失敗する必要があります。このタイプの障害は、環境がメモリをオーバーコミットしているかどうかに関係なく、をmalloc返すことによって通知する必要があります。NULL

于 2010-02-17T11:56:53.927 に答える
7

毎回NULLの戻り値をチェックする必要があります。すべてのライブラリ関数が失敗する可能性があります。fclose()でさえも実行します(切断されたNFS共有で、NFSファイルのfcloseからのエラーは、データが保存されなかったことを意味します)。

ほとんどのソフトウェアはひどく書かれていて、すべてのチェックが含まれているわけではありません。

mallocは、NULLまたはポインター以外のものを返すことはできません。全部かゼロか。10を要求した場合、mallocから1バイトを取得することはできません。

于 2010-02-15T15:01:08.803 に答える
3

カーネルにオーバーコミット可能なメモリがあるかどうかに関係なく、NULLを返す可能性のあるすべての関数呼び出しでNULLを厳密にチェックすることをお勧めします。

以下の次のコードセグメントは、への呼び出しが機能したかどうかを確認する方法を示してmallocいます...

void * ptr = malloc(10);
if(ptr!= NULL){
   /*ptrを使用してここで何かを行います*/
}そうしないと{
   /*失敗した場合はここで何かをします*/
}

ファイル操作、名前を付けるメモリ操作ですが、失敗するとNULLを返すものもあります。

これがお役に立てば幸いです、よろしく、トム。

于 2010-02-16T20:34:36.180 に答える
1

ええと...Linuxではメモリは(最初は)ページバッキングされておらず、最初の読み取り/書き込み後にのみページバッキングを作成するため、OSは常にメモリを提供し続けます(アドレス空間を使い果たした場合を除き、64ビットシステムでは不可能です) )。したがって、メモリが不足していて、約束されたメモリを提供できない場合、OOM killerは、アプリケーションまたは他のアプリケーションを強制終了して、必要なページバッキングを提供します。したがって、NULLチェックを実行するかどうかに関係なく、結果は同じで、クラッシュします......。

于 2018-04-24T04:37:22.967 に答える
-5

いいえ、mallocの結果を確認する必要はありません。

mallocが失敗するずっと前に、オペレーティングシステムはすでに多くの問題に遭遇していました。

「OOM-キラーとオーバーコミット」がより良い選択でしょう。

何?お使いのオペレーティングシステムは「OOM-Killerandovercommit」をサポートしていませんか?

そのため、Linux(またはAndroid)に切り替える必要があります。

于 2012-07-17T14:52:48.670 に答える