难以理解free()的行为

时间:2012-09-06 09:09:53

标签: c++ c visual-studio-2010 malloc free

int main()
{
    int *ptr, **ptr1;
    ptr = (int*)malloc(sizeof(int));
    ptr1 = (int**)malloc(sizeof(int));
    free(ptr);
    *ptr = 12345;
    ptr1 = &ptr;

    //free(ptr);
    //**ptr1 = 23456;
    printf("%d \n", **ptr1);
    system("pause");
    return 0;
}

当内存已经*ptr时,12345如何存储值freed?所以,现在ptr应该指向garbage。 为什么会这样?

5 个答案:

答案 0 :(得分:8)

在很多层面上,这段代码非常错误。

    来自{。{1}}的
  1. Don't cast the return value
  2. 你分配的是错误的尺码; malloc()需要ptr1,而不是sizeof *ptr1。这是一个指针!
  3. 请记住,sizeof (int)可能会失败。使用前请检查返回值。
  4. malloc()之后,请勿(仅)访问内存。未定义的行为。
  5. 另请注意,当您在其上调用free()时,指针本身不会被销毁;消失的东西是指针所指的内存。因此,如果您愿意,您仍然可以在指针本身中存储指针的位数。很少有这种情况需要这样做,并且在检查这些位时应该小心。

答案 1 :(得分:4)

指针被释放,但它仍然指向分配时的指针。执行此操作被认为是一个严重的编程错误。但运行时环境(通常)不能帮助识别或纠正此类错误。

请勿将枪对准自己并扣动扳机!

答案 2 :(得分:3)

这是未定义的行为,任何事情都可能发生。

free(ptr);
*ptr = 12345;

是非法的。它可能崩溃,或者,如果你运气不好,它似乎可以工作,可能隐藏问题,直到软件运到核电站。虽然,如果您正在编写这样的代码,那么您可能不会为这些公司工作。 :)

答案 3 :(得分:1)

您似乎无法理解未定义的行为。基本上,行为是不确定的。它可以做任何事情,包括(但不限于)以下内容:

  1. 碰撞
  2. 做你错误地期望它做的事
  3. 做你告诉它做的事,但没有产生错误
  4. 在您的控制台上开始一个俄罗斯方块游戏
  5. 重新格式化您的硬盘
  6. 一般来说,访问释放的内存可能(在大多数系统上)看起来好像已经有效,同时随机破坏程序的其他部分认为它拥有的数据(取决于免费后是否有分配)。 / p>

    尝试定义未定义的行为会让你隐藏起来。最好不要在第一时间做到这一点。

答案 4 :(得分:0)

free()释放* ptr指向的内存,但不会更改* ptr的值,所以如果该值与其他任何内容不冲突,它仍然可以工作,但内存可能由其他进程随机分配。通常的做法是免费(ptr); ptr = NULL以避免在没有另一个malloc调用的情况下意外重用内存。