• 締切済み

mallocとfreeについて

int* make_matrix(int size){ int *p; if((p = (int*)malloc(sizeof(int)*size*size)) == NULL){ printf("cannot malloc\n"); exit(1); } return p; } int* add_matrix(int* a, int* b, int size){ int i,j; int* c = make_matrix(size); for(i = 0; i < size; i++) for(j = 0; j < size; j++) c[i*size+j] = a[i*size+j] + b[i*size+j]; return c; } 上記のようなsize×sizeの行列を加算する関数を作ったのですが、この関数を用いてa,b,cの3つの行列を加算したいときに d = add_matrix(add_matrix(a,b,size),c,size) このように書いた場合、add_matrix(a,b,size)の戻り値をどのようにfree()すればよいのでしょうか。

みんなの回答

回答No.2

Cでは基本的には出来ません。手動でガベコレするか、代わりに int* add_matrix(int* a, int* b, int size){ int i,j; for(i = 0; i < size; i++) for(j = 0; j < size; j++) a[i*size+j] += b[i*size+j]; return a; } というように、インプレイスで(追加の容量を使わないで)計算することによって メモリリークを防ぐことは出来ます。

honor
質問者

お礼

回答ありがとうございます。 その方法も考えましたが、今回はaもbも中身を変えたくなかったので、結果用の領域のポインタを引数で渡すことにしました。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

malloc()した時のポインタが保存されていないのですからfree()出来ません。 つまりメモリリーク…となるでしょう。 free()する為にポインタは保持しないとなりません。 # スマートポインタみたいな処理を入れていれば別でしょうけど。

honor
質問者

お礼

回答ありがとうございます。 ワンクッション必要ということですね。 迷いましたが、引数で結果用の領域のポインタを渡すことにしました。

関連するQ&A