使用free(),以后会发生什么?

时间:2016-11-21 18:54:13

标签: c

在我阅读时,需要使用free(),但接下来会发生什么?我的意思是,如果我有这样的东西:

char word[] = "abc";
char *copy;
copy = (char*) malloc(sizeof(char) * (strlen(word) + 1));
strcpy(copy, word);
free(copy);
printf("%s", copy);

它会写我" abc"。为什么呢?

4 个答案:

答案 0 :(得分:4)

使用free()后,指针copy仍然指向相同的内存位置。 free()实际上并不删除内存中写入的内容,而是告诉内存管理您不再需要该部分内存。 这就是它仍然输出abc的原因。但是,您的操作系统可能已将该内存重新分配给另一个应用程序或您在应用程序中分配的一些新内容。如果你运气不好,就会出现分段错误。

答案 1 :(得分:2)

free()释放先前由calloc,malloc或realloc分配的内存。您不应该访问已被释放的内存,因为未定义行为。这只是一个巧合,它仍然保留了以前的内容。

使用工具作为valgrind是一个好主意,它可以告诉您(除其他事项外)您是否正在尝试访问已释放的内存。在linux终端中,你可以这样做:

valgrind ./yourProgram

答案 2 :(得分:0)

这里很好地解释了:

C Reference -- free()

释放内存并不意味着不再有数据。

内存对于新分配是免费的。

访问它将导致未定义的行为。

答案 3 :(得分:0)

正如其他人所说,当代码引用一个释放的指针时,行为是未定义的。在这种情况下,你正在阅读它。但是,很可能不允许写入它,您应该看到分段错误。

我建议您使用MALLOCDEBUG运行它(例如在AIX上它将是MALLOCDEBUG=validate_ptrs)或平台上的类似环境变量,以便您捕获此错误。但是,启用MALLOCDEBUG会对您的程序产生严重的性能影响。另一种方法是编写自己的自由例程,也将释放的指针明确地设置为NULL,如下所示:

#define MYFREE(x) do { free((x)); (x) = NULL; } while(0);