free(variable);
、それなら私は本当にvariable's
もう一度価値を使う必要があります。それは機能しますか?それは悪い習慣ですか?
5 に答える
それは機能しますか?
IDK。これは未定義の動作であるため、機能する場合と機能しない場合があります。
それは悪い習慣ですか?
はい。
それはうまくいくでしょう!
int *f = malloc( 128 );
free( f );
printf( "F has the value: %p\n", f );
さて、にあった値が必要な場合、それは*f
別の質問です。
free()のマニュアルページを参照してください。
free()関数は、ptrが指すメモリスペースを解放します。
つまりmalloc()
、自分が指しているメモリを所有していると呼び出すと、次のように呼び出すと、そこに何があるかが正確にわかります。
free(variable);
あなたはもう所有していません。すべての賭けはオフです。解放されたメモリにアクセスする正当な理由はありません。あなたが本当にそれを必要とするならば、あなたはそれを解放することができません。解放する必要がある場合は、データのコピーを作成します(必要な場合)
変数は引き続き使用できます。それが指し示したヒープメモリはそうではありません。
IOW、これは完全に合理的です(考案された場合):
int *variable = malloc(sizeof *variable);
*variable = 1;
printf("%p: %d", (void *) variable, *variable);
free(variable);
variable = malloc(sizeof *variable);
*variable = 2;
printf("%p: %d", (void *) variable, *variable);
を呼び出した後、新しいポインタ値をにfree
割り当てて、作業を続けることができます。そういう意味では、使い続けることができます。 variable
variable
ただし、これは機能しません(または、少なくとも、その動作は未定義です)。
int *variable = malloc(sizeof *variable);
*variable = 1;
free(variable);
*variable = 2;
を呼び出した後、以前はポイントしfree
ていたメモリがvariable
使用できなくなっている可能性があります。書き込もうとすると、クラッシュしたり、他の場所で使用しているメモリが破損したり、正常に動作しているように見える場合があります。
解放されたら、変数を再利用しないでください。再度必要な場合は、必要になるまで変数の解放を移動します。
変数を解放すると、そのメモリの割り当てが解除されます。変数があった場所はまだ古い値を保持しているかもしれませんが、そうではないかもしれません。解放された変数を使用することは悪い習慣であり、多くの場合、バグやクラッシュにつながります。