-10

free(variable);,那么我真的需要再次variable's使用价值。它会起作用吗?这是一个不好的做法吗?

4

5 回答 5

11

它会起作用吗?

身份证。这是未定义的行为,因此它可能有效,也可能无效。

这是一个不好的做法吗?

是的。

于 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()函数释放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,我可以为它分配一个的指针值variable并继续使用它。从这个意义上说,我可以继续使用variable.

然而,这将不起作用(或者至少,它的行为是undefined):

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 回答