- ベストアンサー
free()について
free()についてです。 よろしくお願いします。 ある構造体Aがあったとして その構造体Aの中に構造体Bのポインタが あったとします。 typedef struct{ char b; short c; } B_t; typedef struct { int a; B_t *bbb; } A_t; この構造体をプログラム中でポインタで扱い mallocで領域確保している場合に(A,B共に) Aをfree()した場合は、Bも開放されるのでしょうか? 以下、質問のサンプルです。 A_t *aaa; aaa = (A_t *)malloc(sizeof(A_t)); aaa->bbb = (B_t *)malloc(sizeof(B_t)); : : free(aaa); /* ←これで、aaaのメンバであるbbbは */ /* 開放されるのでしょうか? */ よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
bbbの領域については開放されないですよ~。 aaaで管理しているのは、あくまでbbb領域に対するアドレスであり、aaa領域内にbbb領域があるワケではないです。 1. aaa の領域確保 2. bbb の領域確保 3. bbb の領域開放 4. aaa の領域開放 の順に処理するのが基本だと思います。 C言語(・・・ですよね?)の基本として、メモリ確保(malloc(), calloc())の実行回数と開放(free())の実行回数は必ず同じになると思っててまちがいないです。 がんばってください^^
その他の回答 (2)
- joe-
- ベストアンサー率34% (11/32)
#1さんがご指摘の通り、bbbは解放されません。 メモリリークは結構みつけにくいですよね。 私はメモリリークチェックにmpatrolというツールを使っています。 malloc、freeなどの関数を置き換えて使った回数やどこでメモリリークを発生させているか教えてくれます。結構便利です。
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
どのような順序でfreeを呼び出しても構いませんが、mallocで得たポインタはすべてfreeに渡す必要があります。そうしなければメモリリークが発生します。
補足
はい、おっしゃるとおりC言語です。 そうですか。開放されないのですか。 確かに本文中のA_t型のsizeofはint4バイトと ポインタのアドレス4バイトで8バイトですもんね。。 開放されないとすると、bbbを開放する前に aaaを開放してしまった場合は、メモリリーク って事ですか。。。