• ベストアンサー

freeで開放される範囲

お世話になります 例えばある構造体を、 typedef struct {  char* yoso1;  int yoso2; } kozotai; とし、これをmallocで確保した後中身のポインタにもmallocし、 kozotai* test = (kozotai*)malloc(sizeof(kozotai)); test->yoso1 = (char*)malloc(128); freeで開放すると、 free(test); 中の要素の指すメモリも開放されるでしょうか? 今はどちらか分からないので、 free(test->yoso1);free(test);としています。。。

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

  • ベストアンサー
  • chirubou
  • ベストアンサー率37% (189/502)
回答No.3

malloc() の立場で考えると分かり易いと思います。 kozotai* test = (kozotai*)malloc(sizeof(kozotai)); としてますが、kouzoutai にキャストしているのはmalloc() の外であり、malloc() は自分が確保したメモリ領域の中に、ポインタがあって、そのポインタが指す領域がさらに malloc() されているなんて事は全く知りようがありません。ですから、全て free() するには、 free(test->yoso1);free(test); とするのが正しいです。あるいは、kouzoutai_malloc() と kouzoutai_free() という関数を作り、その中で、上の処理をするという方がキレイかもしれません。 蛇足ですが、malloc() 時には領域の大きさを指定するのに、free() には大きさの指定がないのでしょう?ご存知かも知れませんが、malloc() が返すポインタのアドレスの前に、長さ等の情報が格納されているからで、free() はこの情報を使うので、常に malloc() した分だけを free() できるのです。 ここで敢えて free() の説明を取り上げたのは、C で標準的に使われる関数の大半は、C で簡単に書く事ができます。逆に言えば、それ以上の事をしないのは C のいいところであり悪いところなのかもしれません。 本の記述や仕様を鵜呑みにしないで、内部の処理がどうなっているのか考えてみると、理解もずいぶん深くなりますし、応用も効きます。

masaota56
質問者

お礼

ありがとうございます。 大変参考になりました。

その他の回答 (3)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

No.3さんについて少し細かいですがつっこみです。 >malloc() が返すポインタのアドレスの前に、 >長さ等の情報が格納されているからで C言語で規定されているのはあくまでも、 malloc関数などを実装する処理系において、指定されたサイズの オブジェクトを割り当てその先頭を返すこと。 生存期間が明示的に解放されるまで保持されること。 そして、割り当てられたオブジェクトの先頭から指定サイズの領域が 以降の割り当てで重複しないように割り当てること。 返却したオブジェクトの先頭をfree関数に渡した場合、 この指定された領域を解放し再度、割り当て可能な領域に することなどです。 これらさえ守られていれば、どのようにその情報が管理されるかは、 環境に依存しているため、返却されたアドレスの前後に、 それらの情報が入っているかは、保障されていません。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

>中の要素の指すメモリも開放されるでしょうか? char* 型の変数 yoso1 に malloc した領域へのアドレスが格納されていることを 知っているのはプログラマだけなので、自力で free(test->yoso1); して下さい。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

freeで解放されるのは渡したポインタが直接参照するメモリのみ。その先の構造は考慮されない。端的に言ってmallocした単位でしか解放できないので、複合構造の場合は段階的に解放していく必要がある。