• ベストアンサー

メモリ解放が必要な場合

基本的な質問です。mallocやreallocのときはfreeが必要といわれますが、ローカル変数でポインタ型の変数を宣言したときなどもfreeしてもいいのでしょうか?splintをかけるとmallocのように動的にメモリ確保してないのにメモリリークの可能性が。。。などとエラーがでてしまってどう対応したらよいか困っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • du0315
  • ベストアンサー率20% (1/5)
回答No.3

なんでメモリリークの可能性が。。と出るのかは不明ですが。。 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)」やる権利を持ちます。と同時にそうしてやる義務を負うわけです。

BIGMON
質問者

お礼

ありがとうございます。ここらへんのことがあんましわかっていませんでした。

その他の回答 (3)

  • du0315
  • ベストアンサー率20% (1/5)
回答No.4

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も値が決まっていないので、まともには動かない ですよね?それと同じことです。

BIGMON
質問者

お礼

ありがとうございます。 そういうことでしたか。。。 確かに自分で1から作る場合はポインタだけ宣言ってしないんですが、、、 もともとあるソースをいじって変更しているもので、あんまし変えるのもまずいらしくて。。。。が、大変参考になりました。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

malloc等したもの以外はfreeしてはいけません。 >splintをかけるとmallocのように動的にメモリ確保してないのにメモリリークの可能性が。。。などとエラーがでてしまって どんなコードなんでしょう?

BIGMON
質問者

お礼

返答ありがとうございます。コードは下図のように、ただ構造体のポインタをローカルで宣言していて、アウトプット引数にしてデータをとってくるみたいなものです。。。 AAAをある構造体とすると、 func1(){ AAA* aaa; func2(aaa); }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

単なるポインタ変数はfreeする必要はありません。

関連するQ&A