電子書籍の厳選無料作品が豊富!

勉強不足でとんちんかんな質問になっていたらすいません。プログラムが使用するメモリ領域の,C++とC#の違いについての質問です。

例えば、WindowsのTask Managerを開いて、CやC++を使ってひたすら配列をnewし続けるプログラムを作ってメモリ使用率のグラフの変遷を見ると。期待した通り右肩上がりの使用率グラフを見ることが出来ました。

そこで、C#でのメモリの管理はどのようになっているかを確認したくて、同じ事をやってみました。

//ガベージコレクタに消されないようにするための、newした参照の保持?の為の配列
ArrayList al = new ArrayList();
for(int i = 0;i < 1000;i++)
{
try
{
object a = new int[(50 * 1000 * 1000) / 4];
  al.Add(a);
}
catch (SystemException ex)
{
Console.WriteLine("例外発生");
}
Thread.Sleep(500);
}

これをすると、プログラム上の挙動は予想通り、使用出来るメモリが無くなるまでメモリを割り当てその後は例外を発するようになるのですが。
これをTask Manager上で見ると表面上はなんの変化もないように見えます。

これは、C#で使っているメモリの領域は、C++と違ってOS?が管理しているメモリを使っているので、メモリ使用率は表面上では変わっていなように見えるという理解でいいんでしょうか? それとメモリに関する用語の、ヒープやスタックというのに関係しているんでしょうか(ヒープやスタックが良くわからないので・・・)? 教えてください。

A 回答 (2件)

> これをTask Manager上で見ると表面上はなんの変化もないように見えます。


もしも、64ビット版のOSを使っていて、メモリも4GB以上あるようでしたら、64ビット対応のアプリケーションにしてみたらどうですか。私が試したところ、実行中に使用メモリがだんだん増えていく様子がTask Managerで確認できました。
Visual Studioのビルドメニュー - 構成マネージャー - ソリューションプラットフォームの新規作成でx64を選べば、64ビットアプリケーションになります。

実行開始時に用意したヒープ領域が足りなくなればOSにリクエストを出して使えるメモリ量を動的に追加します。(だから、常駐プログラムにメモリリークがあったりするとシステムのメモリが圧迫されます。)
    • good
    • 0

ガーベッジコレクションでnewした領域が消えることはありません。


delete後にガーベッジコレクションが行われた時に消されます。
newの領域は最初にヒープ領域として割り当てられた場所内ですので、newしたからと言って、新たにOSからのメモリ割り当てが生じるわけではありません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!