2016-11-21 134 views
0

正如我在阅读,有需要使用free(),但接下来发生了什么?我的意思是,如果我有这样的事情:使用free(),稍后会发生什么?

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

它会写我“abc”。为什么?

+6

访问释放的内存触发*未定义行为*。没有“为什么”。任何事情都可能发生。 (并停止投射'malloc'的结果)。 – AnT

+0

[malloc/free。可能重复。可以从释放的内存中读取](http://stackoverflow.com/questions/9673733/malloc-free-can-read-from-freed-memory) –

回答

4

使用free()后,你的指针copy仍指向同一个内存位置。 free()实际上并没有删除内存中写的内容,而是告诉内存管理你不再需要那部分内存。 这就是为什么它仍然输出abc。但是,您的操作系统可能会将该内存重新分配给其他应用程序或您在应用程序中分配的一些新内容。如果你不走运,你会得到分段错误。

+4

我也许会将这句话改为“如果你是幸运的,你会得到分段故障“ – schil227

+0

当然,你是对的。如果你很不幸,你会覆盖已经使用过的内存,而不会有任何警告或错误,不知道是否有晦涩的错误。 – clocktown

2

free()取消分配先前由calloc,malloc或realloc分配的内存。您不应该访问已经释放的内存,因为行为没有定义。这只是一个巧合,它仍然认为它是以前的内容。

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

valgrind ./yourProgram

0

这里是它explayned相当不错:

C Reference -- free()

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

内存只是免费的新分配。

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

0

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

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

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