0

この質問は、なぜ malloc() または new が NULL を返さないのですか?のフォローアップです。C++ でメモリを割り当てる際のSIGKILL :

そこの答えから、によって「正常に」割り当てられたメモリに書き込もうとすると、プログラムが強制終了される理由を理解できますmalloc。ただし、calloc(SLCおよびUbuntuで)使用すると同じ問題が発生します。

NULL ポインターを返す代わりに、プログラムは SIGKILL されるため、戻り値をチェックしてcallocも無駄です。しかしcalloc、「オーバーコミット機能」の影響を受けるべきではありませんか? malloc(裏方に頼らなければ…)

4

1 に答える 1

1

プロセス /proc/sys/vm/overcommit_memoryセクションから

システムに現在割り当てられているメモリの量。コミットされたメモリは、プロセスによってまだ「使用」されていない場合でも、プロセスによって割り当てられたすべてのメモリの合計です。1GBのメモリ割り当てるプロセス (malloc(3))、しかし、そのメモリの 300MB に触れるだけでは、1GB 全体にアドレス空間が割り当てられていても、300MB のメモリを使用しているとしか表示されません。この 1GB は、VM によって「コミット」されたメモリであり、割り当てアプリケーションによっていつでも使用できます。システムで厳密なオーバーコミットが有効になっている場合 (モード 2 /proc/sys/vm/overcommit_memory)、CommitLimit (詳細は上記) を超える割り当ては許可されません。これは、メモリが正常に割り当てられた後、メモリ不足が原因でプロセスが失敗しないことを保証する必要がある場合に役立ちます。

のみmallocが明示的にリストされていますが、類似していると言っていますが (callocおよびrealloc) は類似しています。この問題と同じ問題がありmallocます。

于 2014-06-25T09:15:00.980 に答える