-10

free(variable);、それなら私は本当にvariable'sもう一度価値を使う必要があります。それは機能しますか?それは悪い習慣ですか?

4

5 に答える 5

11

それは機能しますか?

IDK。これは未定義の動作であるため、機能する場合と機能しない場合があります。

それは悪い習慣ですか?

はい。

于 2012-12-11T20:03:24.720 に答える
6

それはうまくいくでしょう!

int *f = malloc( 128 );
free( f );
printf( "F has the value: %p\n", f );

さて、にあった値が必要な場合、それは*f別の質問です。

于 2012-12-11T20:38:52.243 に答える
4

free()のマニュアルページを参照してください。

free()関数は、ptrが指すメモリスペースを解放します。

つまりmalloc()、自分が指しているメモリを所有していると呼び出すと、次のように呼び出すと、そこに何があるかが正確にわかります。

free(variable);

あなたはもう所有していません。すべての賭けはオフです。解放されたメモリにアクセスする正当な理由はありません。あなたが本当にそれを必要とするならば、あなたはそれを解放することができません。解放する必要がある場合は、データのコピーを作成します(必要な場合)

于 2012-12-11T20:09:21.807 に答える
2

変数は引き続き使用できます。それが指し示したヒープメモリはそうではありません。

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割り当てて、作業を続けることができます。そういう意味では、使い続けることができます。 variablevariable

ただし、これは機能しません(または、少なくとも、その動作は未定義です)。

int *variable = malloc(sizeof *variable);
*variable = 1;
free(variable);
*variable = 2;

を呼び出した後、以前はポイントしfreeていたメモリがvariable 使用できなくなっている可能性があります。書き込もうとすると、クラッシュしたり、他の場所で使用しているメモリが破損したり、正常に動作しているように見える場合があります。

于 2012-12-11T20:52:16.667 に答える
0

解放されたら、変数を再利用しないでください。再度必要な場合は、必要になるまで変数の解放を移動します。

変数を解放すると、そのメモリの割り当てが解除されます。変数があった場所はまだ古い値を保持しているかもしれませんが、そうではないかもしれません。解放された変数を使用することは悪い習慣であり、多くの場合、バグやクラッシュにつながります。

于 2012-12-11T20:06:30.423 に答える