我可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
0x8f46008
Hello
0x8f46008
0
Run Code Online (Sandbox Code Playgroud)
free()用零替换内存中的字符串'Hello'吗?
注意:这仅用于学术目的.我永远不会引用释放的记忆.
谢谢,弗兰克
一旦你有free内存块,再次读取该内存会导致不确定的行为,并且是一个严重的安全性和稳定性危险.对于已经存在freed的内存,你不能指望什么都是真的,所以不能保证内存是否会被清零.除非你完全确定自己在做什么,否则在释放后不要引用内存.
作为一个有趣的轶事,最初的模拟城市游戏中有一个错误,它引用了已被释放的内存.在DOS中,这最终没有导致崩溃,但当它被移植到Windows时,游戏开始反复崩溃.Windows团队必须专门在操作系统中构建一个案例,以便在运行SimCity时,将使用自定义内存管理器来防止此类崩溃.你可以在这里阅读全文.
简而言之,一旦它被释放,不要碰它.否则,你冒着一些糟糕的程序员多年来不得不为你修复的漏洞.像valgrind这样的工具可以检测这些类型的错误,特别是因为它们非常讨厌.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |