いいえfree、すべてのメンバーに対して再帰的な解放を行うわけではありません。メモリを割り当てたすべてのメンバーを明示的に解放する必要があります。
構造体にメモリがどのように割り当てられ、どのように解放されるかを理解していれば、これは問題になりません。
struct mystr {
char * strp,
unsigned int foo,
};
malloc & friends を使用してメモリを割り当てた場合、メンバーにのみメモリが割り当てられます。あなたの場合、 one char*and one unsigned int. にデータを格納するためのメモリは割り当てられないことに注意してくださいchar*。strpしたがって、データを保存する前に、メモリを再度割り当てる必要があります。文字列リテラルを直接割り当てる場合を除き、またはポインタstrpを使用して既存のメモリを指す場合を除きます。
例:
ケース 1:
struct mystr s;
s.strp = "literals"; // valid, no need to malloc
ケース 2:
char *p="abc";
s.strp = p; // valid, no need to malloc
strp他のすべての用途では、データを に格納する前にメモリを割り当てる必要がありますstrp。
したがってfree、構造体変数を呼び出すと、 に割り当てられたポインタのみが解放strpされ、 が指すメモリは解放されませんstrp。それは単純に、がどこを指しているfreeかについての情報がないからです。strp
上記の 2 つの例では、strpデータを に格納するためのメモリを割り当てていないため、解放しないことに注意してくださいstrp。1人1人無料というシンプルなルールmalloc/calloc/realloc。