それぞれ文字列を含む構造体へのポインタの配列があるとしましょう。
_printf("%s\n", array[0]);
_
出力は次のとおりです。
_Hello.
_
free(array)
を実行すると、_array[0]
_が指しているものが解放されますか? (_"Hello."
_)。
各要素を手動で解放しようと何時間も費やしましたが、クラッシュするだけです。これが近道であることを願っています:/
これはすべて、アレイがどのように割り当てられたかによって異なります。例を挙げましょう:
例1:
char array[10];
free(array); // nope!
例2:
char *array;
array= malloc(10); // request heap for memory
free(array); // return to heap when no longer needed
例3:
char **array;
array= malloc(10*sizeof(char *));
for (int i=0; i<10; i++) {
array[i]= malloc(10);
}
free(array); // nope. You should do:
for (int i=0; i<10; i++) {
free(array[i]);
}
free(array);
広告。例1:array
はスタック(「自動変数」)に割り当てられており、free
によって解放することはできません。関数が戻ると、そのスタックスペースは解放されます。
広告。例2:malloc
を使用してヒープからストレージを要求します。不要になったら、free
を使用してヒープに戻します。
広告。例3:文字へのポインターの配列を宣言します。最初に配列にストレージを割り当て、次に文字列を配置する各配列要素にストレージを割り当てます。不要になった場合は、最初に文字列を解放し(free
を使用)、次に配列自体を解放する必要があります(free
を使用)。
Free(array)を実行すると、array [0]が指しているものが解放されますか? ("こんにちは。")。
いいえ、自動的に解放されるわけではありませんが、それぞれの割り当て方法によっては、実際に解放する必要がない場合があります。それらがmalloc
および同様の割り当て関数によって返されたメモリを指している場合にのみ、それらを解放する必要があります。
文字列array
へのポインタの配列があるとします。
char * array[2];
array[0] = "Some text"; // You would not need to free this
array[1] = malloc(LENGTH); // This one you would have to free
この場合、array
自体を解放する必要はないことに注意してください。インデックス1の要素のみ。
手動でmalloc()
を解放するだけで済みます。ですから、ポインタによってはそうではないかもしれませんし、必要さえないかもしれません。