メモリを解放しないとどうなる?

このQ&Aのポイント
  • C言語やC++言語のように、動的に確保したメモリを使用後に意識して解放しないといけない言語で、プログラム(アプリケーション)を終了した場合にはシステム的にどうなるのか調査します。
  • 確保されたメモリ領域がそのまま残り、システムとして使用できるメモリ量が減るのか、アプリケーションの終了時に自動的に解放されるのかを確認します。
  • 特にWindowsの場合について調査し、メモリ解放の重要性と注意点についても解説します。
回答を見る
  • ベストアンサー

メモリを解放しないとどうなる?

趣味でプログラムの勉強をしています。 初歩的な質問になると思いますが、よろしくお願いします。 C言語やC++言語のように、動的に確保したメモリを使用後に意識して解放しないといけない言語で、解放の処理をしないままプログラム(アプリケーション)を終了した場合にはシステム(OS?)的にはどのような状態になるのでしょうか? 例: ・malloc して free しない ・new して delete しない 確保されたメモリ領域がそのまま残り、システムとして使用できるメモリ量が減る(解放にはPCの再起動が必要)のでしょうか? それともアプリケーションの終了時に自動的に解放されるのでしょうか? Windowsの場合を想定してご回答いただだけると嬉しいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

#1さんの回答の通りです。 プロセスが終了すると、使用していた資源は 解放されます。ファイルも閉じられます。 mallocを無限に繰り返すプログラムを作り、 これを実行します。タスクマネージャで見ると、 ページファイル使用のラインが上がりっぱなしに なりますが、プロセスを強制終了させると、元の レベルに下がるのが観測できます。

siffon9
質問者

お礼

確認方法も含めてご回答ありがとうございました。 実際に試してみたところ、ご教示いただきましたとおりPF使用量が増加し続け、アプリケーションの強制終了で元に戻ることが確認できました。

その他の回答 (3)

noname#217196
noname#217196
回答No.3

メモリー領域は解放されないままです。このためメモリーリークという障害をもたらします。 図にすると、下の■のようにメモリーを分断して未解放領域が残ると、連続した□ブロックは本来最大8プロック得られるはずが、それより少なくなってしまいます。 □□□□■□□□

siffon9
質問者

お礼

ご回答ありがとうございました。 アプリケーションを終了すると取得したメモリ領域は開放されるようです。

  • asuncion
  • ベストアンサー率33% (2126/6287)
回答No.2

>・malloc して free しない 例えば、 p = malloc(123); // 123は適当な値 /* 何かの処理 */ p = malloc(456); // 456は適当な値 なんて書いちゃうと、1回目のmallocで確保した123バイトの領域が 宙に浮いてしまいます(メモリーリーク)。 プログラムの終了とともにその123バイトを適切に開放してくれるかどうか、 私にはわかりません。

siffon9
質問者

お礼

ご回答ありがとうございました。 アプリケーションの終了で自動開放されることが確認できました。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

プログラム終了で自動解放されます。 実際にプログラムを作成して試せばすぐに分かります。

siffon9
質問者

お礼

ご回答ありがとうございました。 仰られるとおりアプリケーションの終了で自動開放されることが確認できました。

関連するQ&A

  • mallocで確保したメモリをfree解放する必要

    当方、C言語を勉強中です。 mallocで確保しておいたメモリをfreeで必ず解放するようにと教わりました。 freeで開放しないことをひどく野蛮な言葉で例えられたのですが、それほどまでに必要である実感が実はあまりありません。 ファイルポインタでファイルを開いているときに、プログラムが終了すると開いているファイルを自動的に閉じるように、プログラムが終了すると自動的に解放されるものと思っていたのですが、やはりこちらはプログラム終了後も確保されたままになってしまうのでしょうか。 また、解放しないことによるデメリットで、メモリを圧迫する以外にはなにがあるのでしょうか。 ご教授おねがいします。

  • C/C++言語のメモリについて

    C言語でメモリを2種類?に分けると、スタックとヒープがあります。 ヒープは mallocなどで確保し、freeで解放しますがスタックは解放する必要がありません。 そのスタックは通常、何バイトまで可能なのでしょうか? あと関数外のファイルの先頭に int[1000000];とした場合、このメモリはmallocで確保していませんが、 どこに作られるのでしょうか? 私のパソコンはメモリが2GBでWindows2000ですが、CやC++で最大、何バイトまでメモリが使えますか? また、一番多くメモリを確保できるなら、OSはなんでも構いません。 解釈等も間違っていたらご指摘していただきたいです。

  • C言語で、メモリを解放しないで終わるプログラム

    C言語の話です。 mallocなどで領域を確保したら、解放しなければいけないんですよね。 しかし、解放しないで終了すると具体的にどうなるのか、私は理解していません。 次のような、freeしないプログラムを作って何回か実行してみました。しかし、別におかしくならないですね。 #include <stdio.h> #include <string.h> #include <stdlib.h> char *cp; int main(void) { unsigned int n; printf("サイズ(2以上)を入力してください:"); scanf("%d",&n); cp=malloc(n); if(!cp) { printf("%s\n","mallocできませんでした。"); return(1); } strcpy(cp,"A"); printf("cpは%sです。\n", cp); printf("それでは終わりにします\n"); return(0); } グローバルでcharの固定長の配列を宣言したとすれば、プログラムの終了時にその領域は解放されると思います。 このような固定長の配列の場合とmallocの場合との違いが問題なんです。  実験的に、解放しないがために何かおかしくなってしまったり、悪影響を及ぼしたりするようなプログラムを作りたいんですが、どのようにすればよいでしょうか。 もしも私の環境ではそのようなプログラムが作れないなら、別の環境の話でもよいので具体的にこんなふうになってしまうという話をお聞きしたいんです。 過去の質問を検索してみました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=160037 ここのNo.9では、「freeしないアプリケーションの起動・終了を繰り返すと、リソースが不足する」旨が書かれていて、質問者の方もそれで納得されているようです。 しかし、私は、リソースが不足するとはどういうことで、何が起こるのか、知りません。 私のマシン OS:Windows98SE VC++6.0

  • 多次元配列のメモリ解放

    多次元配列のメモリ解放についてです。 以下のような方法で多次元配列を確保した場合に、 --- char** ppMain; ppMain = new char*[3]; for (int i = 0; i < 3; i++){ ppMain[i] = new char[20]; } --- メモリ解放する場合、 --- for (int i = 0; i < 3; i++){ delete [] ppMain[i]; ppMain[i] = NULL; } delete [] ppMain; ppMain = NULL; --- で良いでしょうか? おそらく、new/deleteの回数が同じであれば問題ないと思うのですが。 少し混乱してしまって、 delete [] ppMain[i]; によって new char*[3]で確保したところも解放されており delete [] ppMain; が必要なく危険な領域まで解放しようとしているということはないでしょうか? ご専門、お詳しいかたコメント宜しくお願いします。

  • メモリの解放free

    double **w; int no;    | if((w = (double *)malloc(sizeof(double)*no))==NULL){ printf("Memory Error1"); exit(1); }    |  データ格納処理    | free(w); のようなプログラムの中で、 データ格納処理の途中でSegmentation faultで 落ちてしまいました。この場合、freeが実行されなくても メモリは解放してくれるのでしょうか? また、mallocでメモリ確保できたはずなのに 存在するはずの場所にデータを格納できない原因として 考えられるものはなんでしょうか? ちなみに、落ちる場所が実行の度に変わっているようで、 同じ条件なのにデータの格納数が違っています。

  • IEのメモリを解放したい

    現在、WEBを使用したシステム(c#.Net、javaアプレットを使用)を開発しています 運用上、ブラウザを終日起動したままなので、3~4時間ほどでIEの使用メモリが150MB程度になり javaアプレットが起動できなくなります。 アプリケーション、もしくはサーバー/クライアントの設定で、 IEを起動している最中に不要なメモリを解放する方法を ご存知の方がいましたら教えてください。

  • 自アプリ内のメモリを管理したい

    こんにちは。 現在C/C++でプログラムを組んでいます。 C/C++でメモリを確保、開放するにはmalloc、new、free,deleteを使うわけですがアプリケーションが開始された時点で、ある一定のメモリを確保しておいてそのメモリから分け与えたりデフラグしたりして自分のアプリで使うメモリを管理したいと思っています。 BYTE* g_allMemory;//グローバル変数 g_allMemory = new BYTE[1024]; プログラムを実行した時点でこのようにメモリを確保しておき要所要所で自作関数を利用してメモリを分け与えたりデフラグしたりして使えるようにしたいのです。 しかしデフラグした瞬間に変数のアドレスがずれてしまって使い物になりません。 これを解決したいのですがアドバイスやお勧めのホームページや参考文献などがあったら紹介をお願いします。

  • Linux系OSのメモリの解放について

    お世話になります。 CentOS6.4を使ってPHPアプリを動かしています。 結構メモリを消費するアプリなので、 使っているうちにOutOfMemoryになることがあります。 ※正常終了する場合もあります。 正常に終了しようがOutOfMemoryになろうが、 大量にメモリを確保した後は、そのまま解放されていないように見えます。 例えば、freeコマンドで見たときにに usedが減りません。 【例】 アプリケーション実行前 # apachectl restart # free total used free shared buffers cached Mem: 16334660 472788 15861872 0 105700 120124 -/+ buffers/cache: 246964 16087696 Swap: 2047992 0 2047992 ここでアプリケーション実行し正常に終了。 # free total used free shared buffers cached Mem: 16334660 1754276 14580384 0 106836 120484 -/+ buffers/cache: 1526956 14807704 Swap: 2047992 0 2047992 apacheを再起動すればusedは減るのですが、 他にusedになっているメモリを開放する方法はあるのでしょうか? また、どのようなメカニズムで解放されないのか教えていただけるとありがたいです。 よろしくお願いします。

  • インスタンス破棄時にメモリが解放されるようにしたい

    C++言語でプログラムを作成しています あるクラスでインスタンス生成時に動的にメモリを割り当てた後 インスタンスが破棄されるまでそれを使用し インスタンス破棄時に解放するにはどうしたらいいでしょうか デストラクタで解放処理を実装すると 明示的にデストラクタが呼ばれた際に解放されてしまい インスタンスが破棄されるまで使用できませんでした

  • メモリの解放について

    メモリの解放について c#で、Mysqlへデータセットするプログラムを作っているのですが、登録する度にメモリが増加していきます。昔、VC++で同じようなプログラムを作成した時にも同現象が発生したので、SetProcessWorkingSetSize()を使って解決したのですが、c#では、解決する方法はあるのでしょうか? ご教授お願いいたします。

専門家に質問してみよう