free()用零替换字符串?

时间:2012-02-03 03:13:55

标签: 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;
}

我明白了:

0x8f46008
Hello
0x8f46008
0

free()是否用零替换内存中的字符串'Hello'?

注意:这仅用于学术目的。我永远不会将释放的记忆用于真实。

谢谢, 弗兰克

3 个答案:

答案 0 :(得分:6)

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

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

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

希望这有帮助!

答案 1 :(得分:2)

在您mystring内存之后,*mystringmystring[0]free和朋友)的内容 undefined 。你不能依赖它包含“你好”。您也不能依赖它包含ASCII NUL(如您所见)。

您也不能依赖于阅读而不会导致分段错误不要这样做

如果您要在valgrind等内存检查程序中运行此程序,则会在此处看到有关访问已释放内存的错误。

答案 2 :(得分:0)

也许在特定计算机上的调试模式下,并使用您的特定编译器编译,一般情况下,您应该期望这段代码崩溃(或更糟)。