しばらくコーディングしていないので、前もって失礼します。私はこの奇妙な問題を抱えています。一度に 8GB を malloc しようとしていますが、後で TLSF でそのヒープを管理する予定です。つまり、アプリケーション全体で malloc することをまったく避けたいのです。最初に 1 つの大きなグロブを取得し、最後にそれを解放するだけです。しかし、ここに特異性があります。私は今までプログラムで常に dlmalloc を使用していました。それをリンクすると、すべてがうまくいきました。しかし、一度に 8GB を malloc しようとし、それを使用するために dlmalloc にリンクしようとすると、実行時に OSX でセグメンテーション エラー 11 が発生します。gcc を使用するか、clang を使用するかは問題ではありません。システムには8GBのRAMはありませんが、4GBあります。興味深いことに、32 GB の RAM を搭載した Windows マシンと 16 GB の RAM を搭載した Ubuntu マシンでも同じことが起こります。システムmallocを使用すると、すべて機能します。割り当てが行われ、割り当てられたメモリを介した単純な反復は、3 つのシステムすべてで期待どおりに機能します。しかし、dlmalloc でリンクすると失敗します。malloc と dlmalloc 関数呼び出しの両方で試しました。
割り当て自体は特別なことではなく、プレーンな c99 です。
[...]
size_t bytes = 1024LL*1024LL*1024LL*8LL;
unsigned long *m = (unsigned long*)malloc(bytes);
[...]
ここでいくつかのことで混乱しています。システムに4GBまたはRAMがなくても、システムmallocが8GBのmallocを提供するのはなぜですか?それらは仮想ページですか? dlmalloc が同じことをしないのはなぜですか? 割り当てる RAM の 8 GB の連続ブロックがない可能性があることは承知していますが、なぜセグメンテーション違反が発生し、null ptr ではないのでしょうか?
システムにそれほど多くのRAMがあるかどうかわからなくても、mallocからその量のRAMを一度に取得するための実行可能な堅牢な(できればプラットフォームニュートラルな)ソリューションはありますか?
編集:プログラムは、私が実行しているOSと同様に64ビットです。
edit2: それで、もう少し遊んでみました。割り当てを 1GB のチャンク、つまり 8 つの個別の malloc に分割すると、dlmalloc で動作することがわかります。したがって、連続したブロックがある場合にのみ dlmalloc がおそらく割り当てを試みる、連続した範囲の割り当てに関する問題のようです。これにより、私の質問が定式化するのがさらに難しくなります。プラットフォーム間で dlmalloc の有無にかかわらず、そのサイズのメモリ チャンクを取得し、物理メモリが残っていない場合に失敗しない方法はありますか (失敗しない限り、スワップすることができます)。また、クロスプラットフォームの方法で、malloc が RAM にあるかスワップにあるかを判断することもできます。