- ベストアンサー
メモリ解放が必要な場合
基本的な質問です。mallocやreallocのときはfreeが必要といわれますが、ローカル変数でポインタ型の変数を宣言したときなどもfreeしてもいいのでしょうか?splintをかけるとmallocのように動的にメモリ確保してないのにメモリリークの可能性が。。。などとエラーがでてしまってどう対応したらよいか困っています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
なんでメモリリークの可能性が。。と出るのかは不明ですが。。 mallocやreallocで確保された領域には、名前が付いていません。名前が付いていないので、アクセスできません。。。では困るので、ポインタ経由でアクセスすることになります。 char *p_a; p_a = malloc(10); など。mallocで確保された領域(10byte分)と、ポインタp_a自身の領域は別物だという点に注意。 free(p_a); で開放されるのは、p_aというポインタ自身の領域ではなく、p_aが指している先の(おそらくmallocが確保したであろう)領域です。先の例では、10バイトの領域が開放されることになります。 mallocで確保されるのではない、グローバル変数や、ローカル変数は、定められた寿命を持ちます。(プロセスと同じ寿命、または関数と同じ寿命)なので、free()によって開放することはできません。逆に、mallocで確保された領域の寿命はプログラマ次第です。プログラマが好きなときに「殺して(free)」やる権利を持ちます。と同時にそうしてやる義務を負うわけです。
その他の回答 (3)
- du0315
- ベストアンサー率20% (1/5)
AAAをある構造体とすると、 func1(){ AAA* aaa; func2(aaa); } これでは、バグります。 aaaは構造体AAAへのポインタ型です。ポインタは、どこかの領域を指すために使います。aaaはどこを指しているでしょうか?? 答え:どこか適当な場所を指している。 つまり、ポインタaaaは初期化されていないので、適当な値が入っています。で、func2はその適当な値をアドレスだとおもって、そこの番地に、値を書き込もうとします。そこが悪さをします。おそらく、こう書くべきです。 func1(){ AAA bbb; func2(&bbb); } もしくは、 func1(){ AAA *aaa, bbb; aaa = &bbb; func2(aaa); } ポインタ変数にせよなんにせよ、値を設定しなければ 意味を持ちません。 例えば、次の関数func_a()はどんな動きをすると 思いますか?(plus()は、足し算をする関数として) int func_a(){ int x,y,z; z = plus(x, y); return z; } xもyも値が決まっていないので、まともには動かない ですよね?それと同じことです。
お礼
ありがとうございます。 そういうことでしたか。。。 確かに自分で1から作る場合はポインタだけ宣言ってしないんですが、、、 もともとあるソースをいじって変更しているもので、あんまし変えるのもまずいらしくて。。。。が、大変参考になりました。
- notnot
- ベストアンサー率47% (4900/10358)
malloc等したもの以外はfreeしてはいけません。 >splintをかけるとmallocのように動的にメモリ確保してないのにメモリリークの可能性が。。。などとエラーがでてしまって どんなコードなんでしょう?
お礼
返答ありがとうございます。コードは下図のように、ただ構造体のポインタをローカルで宣言していて、アウトプット引数にしてデータをとってくるみたいなものです。。。 AAAをある構造体とすると、 func1(){ AAA* aaa; func2(aaa); }
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
単なるポインタ変数はfreeする必要はありません。
お礼
ありがとうございます。ここらへんのことがあんましわかっていませんでした。