- ベストアンサー
malloc関数の使い終わった後の開放について
notnotの回答
- notnot
- ベストアンサー率47% (4856/10272)
心配ありません。 通常のOS(含むWindows)だと、プログラム起動時に仮想メモリ空間が割り当てられて、その空間は終了時に削除されます。malloc,free等はこのメモリ空間の中での出来事なので、freeしなくて終了して大丈夫です。 mallocでのメモリ確保じゃなくて、OSの管理する何らかのリソースをAPIを使ってした場合は、明示的に開放しないと終了しても開放されないことがあります。
関連するQ&A
- malloc関数 free開放とはなんですか?
malloc関数を用いてメモリを確保した後、 必ずfreeで開放を行わなければならないですよね? この開放とはどういう意味なのでしょうか?
- ベストアンサー
- C・C++・C#
- メモリ操作関数『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バイトのメモリ確保の数値を変えても、何も変わらないため本当に問題の要求どおりのプログラムが作れているのか謎です。 間違っているなどのアドバイス宜しくお願いします。
- ベストアンサー
- C・C++・C#
- 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・C++・C#
- 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・C++・C#
- c言語のmalloc関数、またrealloc関数
c言語のmalloc関数は確保するメモリの領域を、配列としてのみしか処理出来ないのですか。 つまり、malloc関数で確保したメモリの領域を変数、また多次元配列、また構造体としては処理出来ないのでしょうか。 c言語のrealloc関数は以前の確保したメモリの領域から、確保し直したメモリの領域の場所が変わるかもしれないという事ですが、この場合の場所が変わるという意味は、メモリの領域のアドレスが変わるという事でしょうか。 また、以前の確保したメモリの領域に代入していたデータが使用出来なくなるという事でしょうか。
- 締切済み
- C・C++・C#
- 大容量をmalloc()した後にfree()
C言語でシステム開発しています。 大容量をmalloc()した後にfree()すると、プロセスが強制終了してしまいます。 malloc()のサイズが小さい場合は問題がありません。 こういった場合にプロセスが強制終了しない方法はないものでしょうか?。 ご存知の方がいらっしゃればお教えいただきたいです。 以上です。
- ベストアンサー
- C・C++・C#
- 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); }
- ベストアンサー
- C・C++・C#
- mallocで確保したメモリをfree解放する必要
当方、C言語を勉強中です。 mallocで確保しておいたメモリをfreeで必ず解放するようにと教わりました。 freeで開放しないことをひどく野蛮な言葉で例えられたのですが、それほどまでに必要である実感が実はあまりありません。 ファイルポインタでファイルを開いているときに、プログラムが終了すると開いているファイルを自動的に閉じるように、プログラムが終了すると自動的に解放されるものと思っていたのですが、やはりこちらはプログラム終了後も確保されたままになってしまうのでしょうか。 また、解放しないことによるデメリットで、メモリを圧迫する以外にはなにがあるのでしょうか。 ご教授おねがいします。
- ベストアンサー
- C・C++・C#
- 関数宣言
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); }
- ベストアンサー
- C・C++・C#
- malloc でのメモリ取得状況の可視化
Cで作成したWinXPで動くプログラムです。 malloc - free を繰り返して使っていると、どうもメモリが断片化するらしく、よくメモリ不足でエラーになります。free で開放したつもりで、開放できていないという可能性も否定できません。 そこで、メモリ確保状態を可視化できるツールなどありましたら紹介お願いします。 アプリのソースリストがありますので、可視化するプログラムを埋め込むことも可能です。そのようなライブラリのご紹介も歓迎です。 よろしくお願いいたします。
- 締切済み
- C・C++・C#
お礼
freeを使わなくてもいいことはわかりました。 本には「必ずfreeを使え」と書いていたので、 先生に「特に問題ない」と言われても「やっぱしプログラム中で開放したい」と思っていました。 しかしそれが一般的なら気にしないようにします。 C言語でtry catchが使えたらこの問題は解決したんでしょうね?