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

A 回答 (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)」やる権利を持ちます。と同時にそうしてやる義務を負うわけです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/24 13:40

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

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

お礼日時:2005/04/24 15:08

malloc等したもの以外はfreeしてはいけません。



>splintをかけるとmallocのように動的にメモリ確保してないのにメモリリークの可能性が。。。などとエラーがでてしまって
どんなコードなんでしょう?
    • good
    • 0
この回答へのお礼

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

AAAをある構造体とすると、
func1(){
AAA* aaa;
func2(aaa);
}

お礼日時:2005/04/24 13:37

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

    • good
    • 0

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


人気Q&Aランキング

おすすめ情報