![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
勉強不足でとんちんかんな質問になっていたらすいません。プログラムが使用するメモリ領域の,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件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
> これをTask Manager上で見ると表面上はなんの変化もないように見えます。
もしも、64ビット版のOSを使っていて、メモリも4GB以上あるようでしたら、64ビット対応のアプリケーションにしてみたらどうですか。私が試したところ、実行中に使用メモリがだんだん増えていく様子がTask Managerで確認できました。
Visual Studioのビルドメニュー - 構成マネージャー - ソリューションプラットフォームの新規作成でx64を選べば、64ビットアプリケーションになります。
実行開始時に用意したヒープ領域が足りなくなればOSにリクエストを出して使えるメモリ量を動的に追加します。(だから、常駐プログラムにメモリリークがあったりするとシステムのメモリが圧迫されます。)
No.1
- 回答日時:
ガーベッジコレクションでnewした領域が消えることはありません。
delete後にガーベッジコレクションが行われた時に消されます。
newの領域は最初にヒープ領域として割り当てられた場所内ですので、newしたからと言って、新たにOSからのメモリ割り当てが生じるわけではありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- その他(パソコン・周辺機器) タブレットで使用するUSBメモリについて 7 2022/05/26 14:27
- その他(パソコン・周辺機器) 回復ドライブは何回も作れますか? 4 2022/11/01 21:13
- Android(アンドロイド) galaxy s8+にUSBメモリ(type-c)を接続し、動画再生すると熱くなるのですが… USB 5 2022/06/24 17:21
- iPhone(アイフォーン) iCloudのデータをiPhoneメモリに移動したい 1 2022/10/24 22:11
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- CPU・メモリ・マザーボード Windows11アップデート後の不具合(メモリ不足)について 9 2023/01/04 11:34
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
【C言語】再帰が時間がかかる...
-
エクセルVBA 大容量CSVファイル...
-
C言語初心者です。debug assert...
-
プログラムの最大メモリ消費量...
-
エクセルのメモリ使用状況/Appl...
-
VBAの配列サイズとメモリに関して
-
「memcpy」と「strcpy」について
-
C#で使用しているメモリ領域?
-
これて逆じゃないですか?
-
メモリのセグメント違反の解決...
-
Macターミナルで実行中のプログ...
-
逆コンパイルと逆アセンブルの...
-
緯度、経度の 10進法と 60進法...
-
イラストレーターCS4のシリアル...
-
Excelでのセル内容の高速消去方法
-
C# シリアル通信でデータ受信...
-
バックグラウンドのプロセスの...
-
API関数 GetExitCodeProcess
-
3のつく数字と3の倍数のみを表...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で、メモリを解放しないで...
-
VBAの配列サイズとメモリに関して
-
【C言語】再帰が時間がかかる...
-
C言語における再帰呼び出しの...
-
メモリが不足しています(VBA)
-
メモリのセグメント違反の解決...
-
メモリ不足
-
エクセル キャッシュメモリー...
-
ファイルマッピング関数で失敗
-
動的メモリとexit(C言語)
-
エクセルVBA 大容量CSVファイル...
-
メモリの解放の仕方
-
「ヒープサイズの設定」て何?
-
EXCEL-VBAにてADOのレコードセ...
-
LoadLibraryしたらFreeLibrary
-
マインスイーパ、自動解析プロ...
-
バッチファイルでの実行EXEのメ...
-
C言語:関数のメモリ上でのサイ...
-
エクセルのメモリ使用状況/Appl...
-
大容量のメモリ確保をスワップ...
おすすめ情報