• ベストアンサー

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は */ /* 開放されるのでしょうか? */ よろしくお願い致します。

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

  • ベストアンサー
  • Ganz
  • ベストアンサー率33% (3/9)
回答No.1

bbbの領域については開放されないですよ~。 aaaで管理しているのは、あくまでbbb領域に対するアドレスであり、aaa領域内にbbb領域があるワケではないです。 1. aaa の領域確保 2. bbb の領域確保 3. bbb の領域開放 4. aaa の領域開放 の順に処理するのが基本だと思います。 C言語(・・・ですよね?)の基本として、メモリ確保(malloc(), calloc())の実行回数と開放(free())の実行回数は必ず同じになると思っててまちがいないです。 がんばってください^^

f_attck
質問者

補足

はい、おっしゃるとおりC言語です。 そうですか。開放されないのですか。 確かに本文中のA_t型のsizeofはint4バイトと ポインタのアドレス4バイトで8バイトですもんね。。 開放されないとすると、bbbを開放する前に aaaを開放してしまった場合は、メモリリーク って事ですか。。。

その他の回答 (2)

  • joe-
  • ベストアンサー率34% (11/32)
回答No.3

#1さんがご指摘の通り、bbbは解放されません。 メモリリークは結構みつけにくいですよね。 私はメモリリークチェックにmpatrolというツールを使っています。 malloc、freeなどの関数を置き換えて使った回数やどこでメモリリークを発生させているか教えてくれます。結構便利です。

参考URL:
http://www.cbmamiga.demon.co.uk/mpatrol/
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

どのような順序でfreeを呼び出しても構いませんが、mallocで得たポインタはすべてfreeに渡す必要があります。そうしなければメモリリークが発生します。

関連するQ&A