• ベストアンサー

malloc関数の使い終わった後の開放について

今、Cでmalloc関数を使った簡単なプログラムを作っています。 それを作っているときに思ったのですが、mallocを使って出来た領域を、freeで開放する前に異常終了したとします。 そういったときに開放する方法はないのでしょうか? 学校の先生から聞いた話によると、「パソコンを次に立ち上げたときに開放される」みたいなことを聞いたのでやらなくてもいいのかも知れませんが、気になるので教えてください。

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

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.6

malloc()はOSからメモリを借用するのではなく、malloc()用に確保された大きなメモリブロックから、要求されたサイズの小さなメモリブロックを切り出す関数です。 free()は「小さなメモリブロックを再利用可能な状態にする」という関数でOSに対して何か影響があるような関数ではありません。 プログラムが終了するとき、malloc()用に確保してある大きなメモリブロックは全て適切に処理されます(どう処理されるかは処理系依存です)。 よって、プログラム終了のときはmalloc()済み、malloc()待ちに関わらずゴミのメモリブロックは残りません。 これはANSI-Cのライブラリ仕様ですからmalloc(),realloc,calloc()とfree()の関連でのみ成立します。 その他のメモリ関連関数/APIでは、プログラム終了時に断片化されたメモリブロックが起こってしまう可能生があります。

noname#16765
質問者

お礼

どうもありがとうございます。 >>プログラムが終了するとき、malloc()用に確保してある大きなメモリブロックは全て適切に処理されます。 という言葉で安心しました。 これでmalloc関数を使うとき、なにも気にせずプログラムできます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.5

> 本には「必ずfreeを使え」と書いていたので、 これはあくまで大原則で例外もあるから。 プロセス終了時にしか解放しない領域なら逆にfreeすべきでないという意見もあるくらいだし。 実際、複雑なデータ構造の場合はfree処理は大変でバグの温床になりやすいし実行時間もかなり使う。どうせプロセス終了時にはOSが全部解放するのにそんな無駄なことをやる必要はないってことで。

全文を見る
すると、全ての回答が全文表示されます。
  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.4

>本には「必ずfreeを使え」と書いていたので、 それは正常にプログラムが進行した場合の話です。 異常終了したらプログラム的にはどうしようもありませんので。

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4854/10269)
回答No.3

心配ありません。 通常のOS(含むWindows)だと、プログラム起動時に仮想メモリ空間が割り当てられて、その空間は終了時に削除されます。malloc,free等はこのメモリ空間の中での出来事なので、freeしなくて終了して大丈夫です。 mallocでのメモリ確保じゃなくて、OSの管理する何らかのリソースをAPIを使ってした場合は、明示的に開放しないと終了しても開放されないことがあります。

noname#16765
質問者

お礼

freeを使わなくてもいいことはわかりました。 本には「必ずfreeを使え」と書いていたので、 先生に「特に問題ない」と言われても「やっぱしプログラム中で開放したい」と思っていました。 しかしそれが一般的なら気にしないようにします。 C言語でtry catchが使えたらこの問題は解決したんでしょうね?

全文を見る
すると、全ての回答が全文表示されます。
  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.2

Windowsだったらめもりくりーななどを使えば解放されるかと思います。

参考URL:
http://www.vector.co.jp/soft/win95/hardware/se109247.html
noname#16765
質問者

補足

すみません。 プログラム自体で開放できるものがないかということです。 プログラムを作ってて、プログラムが終了したのに領域の開放がされていないのがなんとなくなんですが気持ちがよくなくて、出来たらプログラム内で開放したいと思ったんです。 めもりくりーなみたいなのは持ってるので問題はないです。

全文を見る
すると、全ての回答が全文表示されます。
  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.1

通常はプログラムが異常終了したらそれがいわゆる「おばけ」つまり終了したつもりでも動き続けていない限り解放されるはずですがOSによってそのあたりの扱いは変わってきます。 電源を入れ直せば完全の解放されます。

noname#16765
質問者

お礼

さっそくの回答ありがとうございます。 やっぱし異常終了やコマンドプロンプトの×ボタンを押したときに開放する方法はそれ以外ないんですね?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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バイトのメモリ確保の数値を変えても、何も変わらないため本当に問題の要求どおりのプログラムが作れているのか謎です。 間違っているなどのアドバイス宜しくお願いします。

  • mallocとfree

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

  • 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関数等を自作とかされていますでしょうか?  どうぞよろしくお願い致します。

  • c言語のmalloc関数、またrealloc関数

    c言語のmalloc関数は確保するメモリの領域を、配列としてのみしか処理出来ないのですか。 つまり、malloc関数で確保したメモリの領域を変数、また多次元配列、また構造体としては処理出来ないのでしょうか。 c言語のrealloc関数は以前の確保したメモリの領域から、確保し直したメモリの領域の場所が変わるかもしれないという事ですが、この場合の場所が変わるという意味は、メモリの領域のアドレスが変わるという事でしょうか。 また、以前の確保したメモリの領域に代入していたデータが使用出来なくなるという事でしょうか。

  • 大容量をmalloc()した後にfree()

    C言語でシステム開発しています。 大容量をmalloc()した後にfree()すると、プロセスが強制終了してしまいます。 malloc()のサイズが小さい場合は問題がありません。 こういった場合にプロセスが強制終了しない方法はないものでしょうか?。 ご存知の方がいらっしゃればお教えいただきたいです。 以上です。

  • malloc関数の使い方について(初心者)

    膨大なデータ数を扱うためにmalloc関数を用いて配列にデータを格納し、それを表示するプログラムを考えました。コンパイルはできるのですが、実行するとエラーが起こります。freeの開放の仕方が間違っているのでしょうか?よろしくお願いします。 /*ソース*/ #include <stdio.h> #include <stdlib.h> #define N 130000 int main(void) { double *p; int i; p = malloc(N); if(!p){ printf("割り当てエラー"); exit(1); } for(i=0;i<N;i++){ p[i]=i; printf("%f\n",p[i]); } free(p); }

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

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

  • 関数宣言

    3次元で領域を確保するプログラムをmalloc関数を用いて書きました。しかし、プログラムが長いので関数宣言をしなさいといわれたために、以下のプログラムを書きました。しかし、途中でつまづいてしまい、どのように関数を用いたり、関数を定義すれば良いのか混乱しています。初心者ですが、どうかお願いします。 /*ソース*/ #include<stdio.h> #include<stdlib.h> int main(){ double ***C; f3Malloc(C,.,.); //数値を代入(関数の使い方?) f3Free(C,.,.); } /*3次元配列(返し方?)*/ double*** f3Malloc(C,,){ int i,j,x,y,z; x = 2; y = 3; z = 4; C=(double***)malloc(sizeof(double**)*x*y*z); for(i=0;i<y;i++){ C[i]=(double**)malloc(sizeof(double*)*y*z); for(j=0;j<z;j++){ C[i][j]=(double*)malloc(sizeof(double)*z); } } } /*メモリの解放(返し方?)*/ void f3Free(C,.,.){ int i,j,x,y; x = 2; y = 3; for(i=0;i<x;i++){ for(j=0;j<y;j++){ free(C[i][j]); } free(C[i]); } free(C); }

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

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