ソフトウェアエンジニア現役続行

雑多なことを綴ります

構造体のfree

構造体のポインタを宣言して、そこにmallocしてメモリを割り当てたとします。
そして構造体の要素にもポインタがある場合、そこにもmallocしてメモリを割り当てたとします。

これらをfreeしたいときは、構造体のポインタだけfreeするのでは不十分です。構造体の要素のポインタもfreeする必要があります。

例えば、

struct hash {
  char *name;
  char *defn;
};

struct hash *hp;

hp = ( struct hash*) malloc( sizeof( *hp));
hp->name = strdup( "name");
hp->defn = strdup( "defn");

のようにmallocとstrdupでメモリを確保したとします。こういうときは、

free( hp);

だけではmallocされた全てのメモリがfreeされません。

free( np->name);
free( np->defn);
free( np);

としないといけません。

まぁmallocの仕組みを考えたら当たり前なのですが、思わずfree(hp);だけで済ませちゃおうと思っちゃいますよね!?ボクはそう思ってしまいました。。。