どれだけのメモリを割り当てることができるかを理解するために遊んでいます。当初、割り当て可能な最大メモリは物理メモリ(RAM)と同じだと思いました。以下に示すコマンドを実行して、Ubuntu12.04のRAMを確認しました。
~$ free -b
total used free shared buffers cached
Mem: 3170848768 2526740480 644108288 0 265547776 1360060416
-/+ buffers/cache: 901132288 2269716480
Swap: 2428497920 0 2428497920
上に示したように、物理メモリの合計は3Gig(3170848768バイト)で、そのうち644108288バイトだけが空いているので、最大でこれだけのメモリしか割り当てることができないと思いました。以下の2行だけで小さなプログラムを書いてテストしました。
char * p1 = new char[644108290] ;
delete p1;
コードは完全に実行されたため、メモリが正常に割り当てられたことを意味します。また、使用可能な物理空きメモリよりも多くのメモリを割り当てようとしましたが、エラーは発生しませんでした。その後、質問ごとに
仮想メモリを使用しているに違いないと思ったので、コードの空きスワップメモリをテストしたところ、動作しました。
char * p1 = new char[2428497920] ;
delete p1;
空きスワップと空きRAMバイトのメモリを割り当てようとしました
char * p1 = new char[3072606208] ;
delete p1;
しかし、今回のコードはbad_alloc
例外のスローに失敗しました。なぜ今回はコードが機能しなかったのですか。
次に、以下に示すように、コンパイル時に新しいプログラムでメモリを割り当てました。
char p[3072606208] ;
char p2[4072606208] ;
char p3[5072606208];
cout<<"Size of array p = " <<sizeof p <<endl;
cout<<"Size of array p2 = " <<sizeof p2<<endl;
cout<<"Size of array p2 = " <<sizeof p3;
出力ショー
Size of array p = 3072606208
Size of array p1 = 4072606208
Size of array p2 = 777638912
ここで何が起こっているのか理解するのを手伝っていただけませんか。コンパイル時にメモリを割り当てることができたのに、動的には割り当てられなかったのはなぜですか。コンパイル時間を割り当てると、どうしてp
スワップp1
と空きRAMメモリよりも大きいメモリを割り当てることができたのでしょうか。p2
失敗したところ。これはどの程度正確に機能していますか。これは未定義の動作ですか、それともOS固有の動作ですか。ご協力いただきありがとうございます。Ubuntu12.04とgcc4.6.3を使用しています。