いいえ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
。