free()用零替换字符串?

iwa*_*der 1 c string free

我可以使用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'吗?

注意:这仅用于学术目的.我永远不会引用释放的记忆.

谢谢,弗兰克

tem*_*def 6

一旦你有free内存块,再次读取该内存会导致不确定的行为,并且是一个严重的安全性和稳定性危险.对于已经存在freed的内存,你不能指望什么都是真的,所以不能保证内存是否会被清零.除非你完全确定自己在做什么,否则在释放后不要引用内存.

作为一个有趣的轶事,最初的模拟城市游戏中有一个错误,它引用了已被释放的内存.在DOS中,这最终没有导致崩溃,但当它被移植到Windows时,游戏开始反复崩溃.Windows团队必须专门在操作系统中构建一个案例,以便在运行SimCity时,将使用自定义内存管理器来防止此类崩溃.你可以在这里阅读全文.

简而言之,一旦它被释放,不要碰它.否则,你冒着一些糟糕的程序员多年来不得不为你修复的漏洞.像valgrind这样的工具可以检测这些类型的错误,特别是因为它们非常讨厌.

希望这可以帮助!

  • +1.我一直认为ISO应该定义"未定义的行为",因为要求编译器从显示器中取出一只手并将开发人员打到头部,直到他们修复它为止.最初,我的提议是计算机和开发人员睾丸之间的电气连接(或女士的等效物),但我在我的晚年已经成熟:-) (2认同)