2

mallocアプリケーションが返さずに 1 回の呼び出しで割り当てることができる最大サイズ (連続) をバイト単位で取得するにはどうすればよいout of memoryですか? (利用可能な最大のチャンク)

PS: 割り当てたい場合と割り当てたくない場合の両方について、一般的な回答をお願いします (したがって、この質問を再質問する必要はありません)。

4

2 に答える 2

4

(やや) 最新のデスクトップまたはサーバー OS について質問していると思います。

問題は、結果が返された時点ですでに無効になっている可能性があることです。理由は、他のプロセス、スレッド、メモリの断片化などです。他の人がコメントで述べたように、OS はスワップを含め、利用可能なメモリよりも多くのメモリを報告することさえあります。アイデアは、割り当てられたメモリがプロセスによってまばらにしか使用されない可能性があるため、実際にアクセスするメモリページのみが必要に応じて提供され、malloc() 自体は事前にメモリを予約しないということです。

また、過度のスワッピングや他のプロセスの飢餓/スラッシングを引き起こす可能性があるため、できるだけ多くのメモリを割り当てることもお勧めできません。したがって、実際に必要なメモリを割り当てるだけです。

**結論: **忘れてしまいましょう。必要なメモリを割り当てます。多くも少なくもありません。動的メモリが必要な場合は、リストやツリーなどの動的構造について考えるか、使用realloc()してください (ただし、よく考えて使用してください)。

サイドノート:

NULL が返されるまで、割り当てられたブロックのサイズを増やして試してはいけません。これにより断片化が容易に発生し、以前の最大のブロック サイズを割り当てることさえできなくなる可能性があります (上記と同様の理由で)。


組み込み OS の場合、まったく異なる答えがあるかもしれません。

于 2015-06-14T22:20:28.567 に答える
-3

次のコードは、特にリアルタイム オペレーティング システムに見られるリアルタイム決定論的メモリ アロケータについて、おおよその答えを提供します。汎用 OS を対象としていません。

#include <stdio.h>
#include <stdlib.h>

#define INCR 100000

int main(void){
    unsigned long i;
    for(i=1;;i=i+INCR) {
        void *ret = malloc(i);
        if (ret) {
            free(ret);
        }
        else {
            printf("malloc could not allocate memory of size: %ld bytes!\n", i);
            return 0;
        }
    }
}
于 2015-06-14T22:11:04.057 に答える