正如我在阅读,有需要使用free()
,但接下来发生了什么?我的意思是,如果我有这样的事情:使用free(),稍后会发生什么?
char word[] = "abc";
char *copy;
copy = (char*) malloc(sizeof(char) * (strlen(word) + 1));
strcpy(copy, word);
free(copy);
printf("%s", copy);
它会写我“abc”。为什么?
正如我在阅读,有需要使用free()
,但接下来发生了什么?我的意思是,如果我有这样的事情:使用free(),稍后会发生什么?
char word[] = "abc";
char *copy;
copy = (char*) malloc(sizeof(char) * (strlen(word) + 1));
strcpy(copy, word);
free(copy);
printf("%s", copy);
它会写我“abc”。为什么?
free()
取消分配先前由calloc,malloc或realloc分配的内存。您不应该访问已经释放的内存,因为行为没有定义。这只是一个巧合,它仍然认为它是以前的内容。
使用工具作为valgrind是一个好主意,它可以告诉你(除其他事项外)是否尝试访问释放内存。在Linux终端,你可以做这样的:
valgrind ./yourProgram
正如其他人所说,当代码引用释放的指针时,行为是未定义的。在这种情况下,你正在阅读它。但是,写入很可能不被允许,并且您应该看到分段错误。
我建议您使用MALLOCDEBUG(例如,在AIX上它将是MALLOCDEBUG=validate_ptrs
)或您的平台上的类似环境变量运行它,以便您能够捕获此错误。但是打开MALLOCDEBUG会对您的程序产生严重的性能影响。另一种方法是写自己的免费程序还设置如下图所示的释放的指针明确NULL:
#define MYFREE(x) do { free((x)); (x) = NULL; } while(0);
访问释放的内存触发*未定义行为*。没有“为什么”。任何事情都可能发生。 (并停止投射'malloc'的结果)。 – AnT
[malloc/free。可能重复。可以从释放的内存中读取](http://stackoverflow.com/questions/9673733/malloc-free-can-read-from-freed-memory) –