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

このQ&Aのポイント
  • mallocで確保したメモリをfree解放する必要があるかについて疑問を持っている
  • 解放しないことによるデメリットについて知りたい
  • プログラム終了後にメモリが自動的に解放されるのか疑問を持っている
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
  • a_kwn
  • ベストアンサー率34% (8/23)
回答No.3

あなたが職業プログラマで、他人からお金をもらってプログラムを組む人ならば、 資源管理に気を配るべきでしょう。 Cプログラムで、この手のことがきちんと行われていない場合には、明らかな瑕疵 (プログラム上の大きな不具合)として扱われます。 (建物を作ったときに建築基準を満たしていないのと同じで、いくら、 「震度7の地震が来ないと倒れないよー」といったところでダメなものはダメ) 確かに、次の場合にはご指摘の通り、まぁ実害はないでしょう。 ・実行時間が短い ・マシンのリソース量に比べて、使用するリソースが多くない 逆に言うと、このどちらかが崩れる場合、 ・ずーーーーと動かさないといけないプログラム ・使用するリソースが非常に多い場合 ちゃんと使わなくなった資源を解放してあげないと、よく分からない不具合に 悩まされることになります。 私の実務上の経験則なのですが、次のことが言えます。 ・普段から確保した資源の解放をきちんと考えて実践し、それが習慣になっていない人は、  (ある日やれと言われても)そもそも出来ない。 ですので、どんな小さなプログラムでも資源の解放を実施し、それを習慣化させてください。 (めんどくせーというのなら、ガベージコレクション機能のある開発環境に行きましょう!)

marriess
質問者

お礼

なるほど。確かに今は小さなプログラムしか書いていないのですが、先を見ればとても大事なことだったのですね。 肝に命じておきます。

その他の回答 (3)

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.4

私としては「malloc()で確保したら必ずfree()で解放」と機械的に覚えるのはお勧めしません。 「free()する必要があるなら必要な場面でfree()すればいい」と私は思ってます(「free()しなくていい」という意味ではないです) >また、解放しないことによるデメリットで、メモリを圧迫する以外にはなにがあるのでしょうか。 「メモリを圧迫する」ではなくて「そのプログラムで再利用されない」かと。

  • BuriBuri4
  • ベストアンサー率28% (150/525)
回答No.2

>ファイルポインタでファイルを開いているときに、プログラムが終了すると開いているファイルを自動的に閉じるように これ、ファイル自体は閉じられるけどストッリームバッファに残っている分は破棄されるからファイルが正しく生成できない可能性が高い。 UNIX系OSでコレをやるとドツボにはまる事がある。 >メモリを圧迫する以外にはなにがあるのでしょうか 利用不可能なメモリーブロックになる可能性がある。 処理系依存だからOSが貧弱 or 無い(組み込み系とかの) 場合にはトラブルになる可能性が高い。 C言語はアセンブリ言語に近く、UNIXを書くために作られた言語なんだから全てがプログラマー責任。 アプリケーションプリグラムだけがプログラムではないのでプログラマー責任は果たす癖を付けておかないと、いつかポカをやる。 ってか、そういうプログラマ責任が面倒なのであればC言語みたいな低級言語(プログラマ任せの部分が多い言語)ではなくJavaのような高級言語(コンパイラ任せの言語)を使ったほうが良いと思う。

  • wolf03
  • ベストアンサー率22% (241/1086)
回答No.1

最近はOSが監視していて解放してくれる場合が多いが、完全であるはずも無い。 本来はプログラムで管理すべき物である為、解放しなければメモリを食いつぶし再起動しなければOSさえ動作しなくなる。 今時はメモリの量が多いので、そこまで行くのに時間が掛かるが、昔は少なかったので厳しかった。

関連するQ&A

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

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

  • mallocでメモリーを確保しようとすると暴走します

     組み込み系のプログラミングをやっているもので、malloc、freeを使って動的にメモリーの確保、開放を行っているのですが、途中で暴走してしまいます。 (mallocを呼び出すと、返ってこなくなります。)    そこでmallocの動作を見ようと、以下のプログラムを作って動作させると、while文の中を一周はするのですが、2週目のp2のポインターの値が返ってきません。(malloc関数の中でloopしています。)     /* 以下ソースコード */  char *p1;  char *p2;  char *p3;  char *p4;  while(1){    p1 = (char*)malloc(100);    p2 = (char*)malloc(100);    p3 = (char*)malloc(100);    free(p3);    p4 = (char*)malloc(100);    free(p4);    free(p2);    free(p1);  }  ※メモリーは、2k確保していあるので、サイズがオーバーしているということはないと思います。  ご質問ですが、  ・上記ソースコードで暴走するような要因がありますでしょうか?  ・malloc、free関数でメモリーの取得、開放の順番など注意しないといけないことがあるのでしょうか?  ・malloc、free関数等を自作とかされていますでしょうか?  どうぞよろしくお願い致します。

  • 動的なメモリ領域の確保

    double型変数5個分のメモリをmalloc関数により確保し,その確保した要素のアドレスを表示するように,プログラムを作る問題で、 (注)に「 %pで表示するためには,double型へのポインタ(double *)をvoid型へのポインタ(void *)にキャストする必要がある.」と書かれていたのですが、どういうことでしょうか? 以下のようでいいのでしょうか? #include<stdio.h> #include<stdlib.h> #define COUNT 5           // 動的に確保するメモリ領域数を示すマクロ定数の定義 int main(void) {  // 動的に確保するメモリ領域のアドレスを保持するポインタ変数の宣言  double * pointer;  int i;                  // for文で使用する変数の宣言  // int型変数5個分のメモリ領域を確保  pointer = (double *)malloc(sizeof(double) * COUNT);  if(pointer == NULL) {        // メモリ領域の確保が失敗した場合   printf("メモリ領域を確保できませんでした.\n");   exit(1);                // プログラムの終了  }  for(i = 0; i < COUNT; i++)   printf("%d番目のアドレスは%pです.\n", i + 1, pointer + i);  free(pointer);            // 確保したメモリ領域の解放  return 0; }

  • メモリ解放が必要な場合

    基本的な質問です。mallocやreallocのときはfreeが必要といわれますが、ローカル変数でポインタ型の変数を宣言したときなどもfreeしてもいいのでしょうか?splintをかけるとmallocのように動的にメモリ確保してないのにメモリリークの可能性が。。。などとエラーがでてしまってどう対応したらよいか困っています。

  • malloc関数 free開放とはなんですか?

    malloc関数を用いてメモリを確保した後、 必ずfreeで開放を行わなければならないですよね? この開放とはどういう意味なのでしょうか?

  • メモリ操作関数『malloc(),free()』

    /*10バイトのメモリ領域を確保し、その領域に文字列"Allocate"を代入せよ。*/ /*ただし、確保した領域は、プログラム終了までに開放すること。*/ #include<stdio.h> #include<stdlib.h> void main(void) { char *ptr; ptr = (char *)malloc(10); printf("Allocate\n"); free(ptr); } 今、ライブラリ関数を勉強しています。 この問題をとりあえず作ってみて、実行も成功したのですが、10バイトのメモリ確保の数値を変えても、何も変わらないため本当に問題の要求どおりのプログラムが作れているのか謎です。 間違っているなどのアドバイス宜しくお願いします。

  • メモリの解放free

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

  • malloc でのメモリ取得状況の可視化

    Cで作成したWinXPで動くプログラムです。 malloc - free を繰り返して使っていると、どうもメモリが断片化するらしく、よくメモリ不足でエラーになります。free で開放したつもりで、開放できていないという可能性も否定できません。 そこで、メモリ確保状態を可視化できるツールなどありましたら紹介お願いします。 アプリのソースリストがありますので、可視化するプログラムを埋め込むことも可能です。そのようなライブラリのご紹介も歓迎です。 よろしくお願いいたします。

  • mallocとfree

    struct list *p; /* 記憶領域の確保 */ if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) { printf("malloc error\n"); exit(1); } とサンプルプログラムがあるのですが、if分の意味がわかりません。 また、mallocを使った場合freeで開放とあるのですが、 どういう意味なのかわかりません。 よろしければ、上記2つの点について教えてください。

  • C言語 mallocとfreeについて

    mallocとfreeを何度も繰り返していると、メモリがどんどん増えていき、最終的にはプログラムが止まってしまいます。 いくつかのページでメモリ確保を繰り返すとメモリをかなり食ってしまうと書いてありました。 これに対する解決策をご存知の方いらっしゃいましたら教えてください。 よろしくお願いします。

専門家に質問してみよう