1

それとも、それを実行してerrnoやポインタをチェックして成功したかどうかを確認する必要がありますか?

4

4 に答える 4

14

malloc を呼び出す前に、使用できるバイト数を確認できるかどうかを尋ねていますか?

もしそうなら、答えはノーです。できたとしても、その答えはあなたにとってあまり価値がないかもしれません。その理由は、使用可能なメモリの量を知ることができないためです。使用可能なメモリの量しかわかりませ。これは、API を適切に利用する方法に影響を与えるため、非常に重要な違いです。

たとえば、available_memory という関数があったとします。このコードは正しいように見えますが、ひどく壊れています

size_t size = GetSizeToAllocate();
if ( size < available_memory() ) {
  // No need to check the answer because there is enough memory
  SomeType* p = malloc(size);
}

その理由は、他のスレッドが if ステートメントと malloc ステートメントの間に入って、独自の割り当てを行う可能性があるためです。これにより、システムの全体的なメモリが減少し、それによって available_memory の戻り値が変化する可能性があります。

さらに悪いことに、システムで使用可能なメモリの量によって、malloc で割り当てることができるメモリの量が決まりません。malloc (およびその他のメモリ割り当て操作) で重要なのは、使用可能な連続メモリの量です。

于 2009-03-27T16:35:08.577 に答える
6

一部のOS(Linuxなど)は楽観的なメモリ割り当て戦略を使用するため、試しても必ずしも役立つとは限りません.NULL以外の結果が得られたとしてもmalloc()、サービスで要求されたメモリのチャックがあるとは限りません.

詳細はこちら

それを行う方法はないようです。

于 2009-03-27T16:38:26.417 に答える
1

Cでそれを行う方法はありません。どのソリューションもOS固有であり、実装するのに十分役立つかどうかはわかりません。

于 2009-03-27T16:33:27.817 に答える
1

プログラムの開始時に必要なメモリ量がわかっている場合、実行中にプログラムが失敗してはならない場合は、開始時に必要なすべてのメモリを 1 つの大きなブロックとして割り当ててから、自分で管理するのが一般的です。

于 2009-03-27T16:51:31.627 に答える