アプリ版:「スタンプのみでお礼する」機能のリリースについて

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()すればよいのでしょうか。

A 回答 (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;
}

というように、インプレイスで(追加の容量を使わないで)計算することによって
メモリリークを防ぐことは出来ます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/06/14 18:04

malloc()した時のポインタが保存されていないのですからfree()出来ません。


つまりメモリリーク…となるでしょう。
free()する為にポインタは保持しないとなりません。
# スマートポインタみたいな処理を入れていれば別でしょうけど。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/06/14 18:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!