web-dev-qa-db-ja.com

C-ポインターの配列を解放すると、ポインターが指しているものも解放されますか?

それぞれ文字列を含む構造体へのポインタの配列があるとしましょう。

_printf("%s\n", array[0]);
_

出力は次のとおりです。

_Hello.
_

free(array)を実行すると、_array[0]_が指しているものが解放されますか? (_"Hello."_)。

各要素を手動で解放しようと何時間も費やしましたが、クラッシュするだけです。これが近道であることを願っています:/

7
Laefica

これはすべて、アレイがどのように割り当てられたかによって異なります。例を挙げましょう:

例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を使用)。

25
Paul Ogilvie

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の要素のみ。

4
giorgim

手動でmalloc()を解放するだけで済みます。ですから、ポインタによってはそうではないかもしれませんし、必要さえないかもしれません。

2
Magisch