4

少し前に、インターネットからソースコードをダウンロードしました。いくつかのmalloc呼び出しがあり、その後、NULLのチェックはありませんでした。私の知る限り、mallocを呼び出した後にNULLをチェックする必要があります。

誰かがmallocを呼び出した後にNULLをチェックしない正当な理由はありますか?私は何かが足りないのですか?

4

4 に答える 4

7

Jens Gustedtがコメントで述べたようにmalloc()、エラーが返されるまでに、プログラムはすでに問題の山になっている可能性があります。プログラムがとにかく何もできない可能性が高い場合に、状況を処理するために一連のエラー処理コードを挿入することは理にかなっていますか?多くのプログラムでは、答えは「いいえ」である可能性がありますが、他のプログラムでは、適切なことを行うことが非常に重要である可能性があります。

割り当てが成功するか、プログラムが終了することを保証する単純な「malloc-or-die」ラッパー関数を使用して、メモリの割り当てを試すことができます。

void* m_malloc(size_t size)
{

    void* p;

    // make sure a size request of `0` doesn't trigger
    // an error situation needlessly 
    if (size == 0) size = 1;

    p = malloc(size);

    if (!p) {
        // attempt to log the error or whatever
        abort();
    }

    return p;
}

次に遭遇する問題の1つは、プログラムを終了する以外に、確実に実行できることはあまりないということです。問題をログに記録する場合でも、ある程度のメモリ割り当てが必要になる可能性が高いため、ログ機能にはおそらく独自の問題があります(割り当ての失敗が、不当に大きなメモリブロックを割り当てようとしたことが原因である場合を除く)。

プログラムの早い段階で、問題をログに記録する必要があるときに解放できる「フェイルセーフ」ブロックを割り当てることで、この問題を解決しようとする場合があります(この戦略を使用するプログラムはかなりあると思います)。ただし、この種のエラー処理にどれだけの労力を費やしてもよいかは、特定のニーズによって異なります。プログラムがエラーを返したときにかなり複雑なことを確実に実行する必要がある場合は、メモリが非常に少ない状況でそれらを実行できるmalloc()ように、対応する保護手段を用意する必要があります。一般に、これは追加の複雑さを意味し、常に努力する価値があるとは限りません。

于 2012-04-14T23:02:48.803 に答える
5

怠惰でコードが醜くなり、どこでもエラーから回復する方法を見つけたくないので、人々はチェックしません。

何人かのプログラマーが「ブロックをmallocできない場合、VMがいっぱいであるため、とにかくシステムがすぐにクラッシュするので、なぜわざわざチェックする必要があるのですか?」と言うのを聞いたことがあります。

同意しません。エラーをログに記録してexit()を呼び出すか、例外をスローすることを意味する場合でも、エラーをチェックする必要があります。巨大なディスクと常時オンのページメモリを備えたシステムに向かう傾向がありましたが、業界は反転し、現在、RAMが制限され、オンデマンドページングがないスマートフォンとタブレットがあります。さらに、デスクトップ上でもデータセットが大きくなりすぎて、mallocが失敗することがあります。

どこにでもコード行を追加したくない場合は、mallocを呼び出してエラーをチェックし、mallocの代わりにそれを使用する独自のmalloc置換を作成するだけです。

于 2012-04-14T22:32:17.450 に答える
3

彼らは予期しないクラッシュを気にしません!

mallocを実行すると、すぐに何かを保存する可能性が非常に高くなります。したがって、NULLをチェックしないと、そこに何かを格納しようとしたときにプログラムがクラッシュする可能性があります。

これは、少量のメモリが要求されたときにmallocがほとんど失敗しない小さなプログラムでは起こりそうにありません。したがって、mallocはNULLを返しません。

しかし、私の意見では、小さなプログラムでも、mallocを練習するのは通常は良いことです。NULL check

于 2012-04-14T22:13:26.303 に答える
1

より多くのメモリが必要で、それ以上のメモリをmalloc提供できない場合は、それについて何かできますか?
優雅に終了すると思います。
しかし、あなたが終了する場合、彼らはあなたがどのように終了するかは実際には問題ではないと思うと思います(クラッシュして回避することもできます、nullのチェックのための「オーバーヘッド」と彼らが考えるもの)。
おそらく、機能はクリーンアップコードを必要としないようなものでしたか?
私は同意しません。NULLmallocのリターンを確認する必要があります

于 2012-04-14T22:15:09.303 に答える