• 締切済み

メモリの解放free

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

みんなの回答

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.5

#2です。私ならこうするかな? #define NN 1000 int main(int argc, char ** argv) { double *w; int i,j; if((w = (double *)malloc(sizeof(double)*NN*NN))== NULL) exit(1); w[i*NN + j] = 0 ; free(w); }

arisa5
質問者

お礼

色々と教えていただき、ありがとうございます。 参考にさせてもらいます。

  • madman
  • ベストアンサー率24% (612/2465)
回答No.4

2次元配列をmallocですか... 普通、構造体使いませんか? typedef struct {   double *w; } TW; TW *w; if((w = (TW *)malloc(sizeof(TW)*no))==NULL){  printf("Memory Error1");  exit(1); } for (i=0; <no; i++){  if((w[i].w = (double *)malloc(sizeof(double)*no))==NULL){   printf("Memory Error2");   exit(1);  } } 利用するときは for (i=0; i<no; i++) {  for (j=0; j<no; j++) {   w[i].w[j] =・・・;  } }

arisa5
質問者

お礼

色々と教えていただき、ありがとうございます。 参考にさせてもらいます。

  • nagare
  • ベストアンサー率33% (280/831)
回答No.3

この場合は2次元配列とはいいせんが・・・ ヒント double **w; double *w1; int no; int no2; if((w1 = (double *)malloc(sizeof(double *)*no))==NULL){ printf("Memory Error1"); exit(1); } w=&w1; for(no2=0; no2<no; no2++){ if((w1[no2] = (double *)malloc(sizeof(double)*no))==NULL){ printf("Memory Error2"); exit(1); } w=1; }

arisa5
質問者

お礼

ありがとうございます。参考にさせてもらいます。

  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.2

w[no]の配列領域を確保するんですから、 double *w; でなければいけませんね。 w = (double *)malloc(sizeof(double)*no) の部分も左右の型が違っていますね。 これではうまく動きません。 malloc()した領域はOSがヒープから割り当てますが、プロセスが終了すれば 普通はOSが開放します。 (プログラムできちんと処理する様にするのがベターですが)

arisa5
質問者

補足

すみません、省略しすぎました。 実際は2次元配列で double **w; int no; int no2; if((w = (double **)malloc(sizeof(double *)*no))==NULL){ printf("Memory Error1"); exit(1); } for(no2=0; no2<no; no2++){ if((w[no2] = (double *)malloc(sizeof(double)*no))==NULL){ printf("Memory Error2"); exit(1); } } とやっています。 メモリは自動解放してくれるのですね。 教えていただき、ありがとうございます。

  • madman
  • ベストアンサー率24% (612/2465)
回答No.1

double **w; を double *w; に変えましょう。何故ダブルポインタにしてるのか不明ですが、これでは意図した動作はできないと思いますよ。 Segmentation Faultで落ちると、プログラムが落ちるのですよね? 大体はOSが開放してくれます。

arisa5
質問者

補足

すみません、省略しすぎました。 実際は2次元配列で double **w; int no; int no2; if((w = (double **)malloc(sizeof(double *)*no))==NULL){ printf("Memory Error1"); exit(1); } for(no2=0; no2<no; no2++){ if((w[no2] = (double *)malloc(sizeof(double)*no))==NULL){ printf("Memory Error2"); exit(1); } } とやっています。 メモリは自動解放してくれるのですね。 教えていただき、ありがとうございます。

関連するQ&A

  • C言語、配列、動的にメモリを割り当て

    すみません。お助けください。 動的なメモリの割り当てによって配列を複数作るときに、メモリを割り当てるルーチンを外部関数化したいのですが、うまくいきません。 具体的にはつぎのような感じです。 b[2] に 値を代入するときに Segmentation fault(core dumped) になってしまいます。 正しくは、どのようにすればよいのでしょうか。 よろしくお願いたします。 main() { int n=5; double *a, *b; mymalloc( a, n ); mymalloc( b, n ); a[2] = 3.5; printf( "%f\n", a[2] ); b[2] = 4.4; printf( "%f\n", b[2] ); } int mymalloc(double *c, int n) { c = (double *)malloc( n * sizeof(double)); }

  • malloc関数によるメモリの確保

    C初心者です。 malloc関数によるメモリの確保に関して教えてください。 2次元配列のサイズに対してmalloc関数の引数値をたとえば、 (double*)malloc(datasize*sizeof(double)) などとしメモリ領域を確保すると、メモリアドレスはデータのサイズ によらず一定 1234044、1234048となります。 データサイズを大きくし、datasize*sizeof(double)が16Kバイトを超えるとcmd.exeがエラーとなり落ちます。 デバックモードで実行すると 「"System.AccessViolationException"のハンドルされていない例外が不明なモジュールです。で発生しました。 追加情報:保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリがこわれていることが考えられます」 というメッセージがでます。 コンパイラはExpressEdition2008です。 この現象を回避するにはどうすべきか、なぜこのようなことが起こるのかご教授ください。 よろしくお願いいたします。

  • メモリの開放について

    いつもお世話になっております。 メモリ開放のお作法について教えてください。 int* p ; p = (int*)malloc( 100 * sizeof( int ) ) ;  ※ p = (int*)malloc( 100 * sizeof( int ) ) ;  ※ p = (int*)malloc( 100 * sizeof( int ) ) ; free(p); このような記述をした場合、※の付いている2行でメモリ確保した 領域は開放されるのでしょうか。 (メモリ確保に失敗した場合の処理は省略してます。) よろしくお願いします。

  • C++ 最適なメモリ確保

    画像処理をするために実験的にC++でプログラムを書いています。 malloc関数でBMP画像の画素位置を、画像画素分確保するだけのint型配列を作成するにはどうしたらよいでしょうか。 因みに、入力画像の解像度は640x480です。 一番左下の画素を(x,y)=(0,0)として考えています。 ある条件の画素に該当する画素座標を、下のStackX,StackYにx,y成分ごとに格納していくものです。 //////// int *StackX = (int *)malloc(sizeof(int)*100000); int *StackY = (int *)malloc(sizeof(int)*100000); //////// 上のように書くと、途中でクラッシュしてしまいます。 ですが、大目にメモリをとって //////// int *StackX = (int *)malloc(sizeof(int)*10000000); int *StackY = (int *)malloc(sizeof(int)*10000000); //////// で実行すると、最後まで動いてくれます。

  • アドレス格納のための二次元配列のメモリ動的確保

    アドレス格納のための二次元配列のメモリ動的確保 二次元配列のためにメモリを動的確保しなければならないのですが、 その配列に格納したいものが 「DATA型のポインタ」です。(DATA型はtypedefした構造体です。) プログラム実行中にmallocで確保した、数あるDATA型の構造体の、その先頭アドレスを リストアップするための配列です。 この場合、どのような形でmallocすればよいのでしょうか? 教えていただけるとありがたいです。よろしくお願いいたします。 -- たとえば m×n のint型の配列は、 ◆ int *i; ◆ i = (int *)malloc( m * n * sizeof(int) ); となりますよね。 この要領がでやるのが一般的にわかりやすいものだとするならその方法でやりたい (後発の人が自分のソースコードを読む可能性があるため)のです。 -- 同様にm×nの「DATA型のポインタを格納するための二次元配列」を動的確保したい場合、 ◆ DATA *d; ◆ d = (DATA *)malloc( m * n * sizeof(DATA) ); この文にどのように付け加えたら良いのでしょう? もうあと一歩な気がするのですが(笑)。しかし参考書等で勉強しましたがわかりませんでした・・・。 わかる方、どなたかよろしくお願いいたしますm(_ _)m あとこれだけ通ればコンパイルが通るんです!!!!! たぶん(笑)

  • free()関数の多用 と Segmentation fault

    これはプログラム中のループ内です ===================== m = IntArray(SIZE); //関数内でmallocを使用 … puts("a");   //最後に'a'が表示されて終了 free(m); puts("b"); ===================== プログラムを実行するとループ内でfree()関数を何度も通るのですが 途中でSegmentation faultが起きて停まります。 free()関数を取り除いても強制終了されます。 この現象の対処法をどなたか教えていただけないでしょうか? よろしくお願いします。

  • メモリの解放free()について

    メモリ解放についての質問です。 下の関数をループで呼び出すとき、new_itemのメモリ解放free()はどのように行えば良いでしょうか? typedef struct _ITEM { int n,m; void *right; } item; int data() { int i,j,k; int n,m; item *new_item,*last_item; for (i = 0; i <= M-1; i++) { ... last_item = &(list[i]); k = 0; for (j = 0; j <= num-1; j++) { /* making new item */ if ((new_item = (item*)malloc(sizeof(item))) == NULL) { fprintf(stderr,"Can't allocate memory.\n"); exit(-1); } new_item->m = i; new_item->n = k; new_item->right = NULL; last_item->right = new_item; last_item = new_item; } } }

  • メモリのセグメント違反の解決方法を教えてください。

    こんにちわ, 現在プログラムを作成しているのですが,Segmentation Faultが出て困っています。 そのセグメント違反が出ているのがmallocの中(PCインナーの関数)で普通ならmallocの返り値がNULLかそれ以外かということになりますが,それ自体も中でセグメント違反が起こるので帰ってきません。 MALLOC_CHECK_=1によってその触っているポインターを見ると, free(): invalid pointer 0x93c5380! free(): invalid pointer 0x93c5c18! とでるので,おそらくmallocのなかで必要なくなったポインターをフリーをしていると考えられるのですが, gdbのwatchpointでそのアドレスを指定してみてみると,メインに入る前にそのポインタ自体をいじっている関数も内部的な関数みたいでどこをなおすとセグメント違反が直るのかわかりません。 このようなメモリ問題がおきたときどのようなツールや解決法があるのでしょうか。 よろしくお願いします。

  • Segmentation Fault (メモリ制限?)

    Segmentation Fault (Fortranのプログラム)に関して質問です。 あるデータを処理するプログラムですが、小さなデータの場合問題ないですが、 大きなデータを扱うようになった場合Segmentation Faultとなります。 宣言している配列サイズを超えた部分のアクセスなどでSegmentation Faultが出ることがあるようですが、どうやらそのような現象ではなく、 メモリ制限にひっかかっている感じがいたします。 エラーが出る部分はどうやらSubroutine内の大きなデータ宣言を している部分のようです。(下の例ではtest bが表示れる以前に止まります。) !-------------------------------------------------- subroutine calc_tri( ) implicit none real*8 data1(3,200000) !<--- ここでエラー --> write(6,*) 'test b' !-------------------------------------------------- このような場合、配列データを減らす以外にどのような対策が あるのでしょうか? あるいはメモリ制限になりそうなデータ数が分る方法などあります でしょうか? 環境は linux (CentOS) intel Fortran Compiler version 8.0 Mem: 1GB topコマンドにて Memの使用割り合いは10%にもならないのですが コンパイラによるメモリ制限などもあるのでしょうか? subroutine内の配列の宣言はデータ数より多くとっていることは確認しています。

  • メモリ動的確保について

    こんにちはです。 メモリの動的確保なのですが、 typedef struct DATA{ char name[256]; char pass[256]; int money; }BANK; void insert(BANK *p,int max); int main(){ int i; size_t st; BANK *person; person = (struct DATA *)malloc(sizeof(struct DATA)); //person = (struct DATA *)malloc(5); if(person == NULL){ printf("確保失敗\n"); exit(-1); } //memset(person,'\0',sizeof(struct DATA)); と、言う風に、記載ソースは途中ですがメモリをとりました。 mallocの後ろの部分ですが、sizeof(struct DATA)と5ではどうちがうのでしょう??2通りともコンパイルエラーはないです。 5は動的に最大5までとるって事はわかるのですが、struct DATAの方はいくつとるのです??いくつもで入力次第です? そして、動的したのにたいしてmemsetしたら実行エラー(コンパイルは通りました)おきました。動的にたいしてmemはダメなのでしょうか? アドバイスいただけたらありがたいです。宜しくお願いいたします。