我可以使用free()帮助。
当我运行以下内容时:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
char *mystring = malloc(6 * sizeof(char));
strcpy(mystring, "Hello");
printf("%p\n", mystring);
printf("%s\n", mystring);
free(mystring);
printf("%p\n", mystring);
printf("%d\n", *mystring);
return 0;
}
我明白了:
0x8f46008
Hello
0x8f46008
0
free()是否用零替换内存中的字符串'Hello'?
注意:这仅用于学术目的。我永远不会将释放的记忆用于真实。
谢谢, 弗兰克
答案 0 :(得分:6)
一旦你有free
个内存块,再次读取该内存会导致不确定的行为,并且存在严重的安全性和稳定性危险。对于已经free
d的内存,你不能指望任何保持为真的内容,因此不能保证内存是否会被清零。除非您完全确定自己在做什么,否则在释放后不会引用内存。
作为一个有趣的轶事,原版的SimCity游戏中有一个错误,它引用了已被释放的内存。在DOS中,这最终没有导致崩溃,但当它被移植到Windows时,游戏开始反复崩溃。 Windows团队必须专门在操作系统中构建一个案例,以便在运行SimCity时,将使用自定义内存管理器来防止此类崩溃。您可以阅读完整的故事here。
简而言之,一旦它被释放,不要碰它。否则,你冒着一些糟糕的程序员多年来不得不为你修复的漏洞。像valgrind这样的工具可以检测出这些类型的错误,特别是因为它们非常讨厌。
希望这有帮助!
答案 1 :(得分:2)
在您mystring
内存之后,*mystring
(mystring[0]
,free
和朋友)的内容 undefined 。你不能依赖它包含“你好”。您也不能依赖它包含ASCII NUL(如您所见)。
您也不能依赖于阅读而不会导致分段错误。 不要这样做。
如果您要在valgrind
等内存检查程序中运行此程序,则会在此处看到有关访问已释放内存的错误。
答案 2 :(得分:0)
也许在特定计算机上的调试模式下,并使用您的特定编译器编译,一般情况下,您应该期望这段代码崩溃(或更糟)。