【问题标题】:Is my free working correctly?我的免费工作正常吗?
【发布时间】:2014-07-09 09:09:18
【问题描述】:

我写了这段代码,看看在分配内存后释放一些内存后会发生什么,但我不明白这里发生了什么。

程序要求用户输入 3 个输入(通过键盘)。然后它打印出输入的每个输入以及它们在内存中的存储位置。然后程序“释放”分配的内存并从相同的内存地址重新打印出新内容。

我的理解是,一旦内存被“释放”,之前存储在其中的内容将被删除,取而代之的是一些随机数。这发生在 ptr 的前两个地址中,但由于某种原因,我输入的第三个数字始终仍存储在“&ptr[2]”中,即使在我释放(ptr)之后也是如此。这里发生了什么?为什么它没有恢复到使用 malloc() 之前的随机数?

我还想问,在 malloc 部分之后,(ptr) 和 (&ptr[0]) 完全一样吗??

#include <stdio.h>
#include <stdlib.h>

main ()
{
    int *ptr;
    int req = 3;
    int i;

    ptr = malloc (req * sizeof(*ptr));

    for (i=0; i<req ; i++)
    {
        printf("Please enter a number: ");
        fflush(stdin);
        scanf("%d", &ptr[i]);
    }

    for (i=0; i<req; i++)
    {
        printf("Number #%d is %d and stored in memory address %d\n", (i+1), ptr[i], &ptr[i]);
    }

    free(ptr);

    for (i=0; i<req; i++)
    {
        printf("Number #%d is %d and stored in memory address %d\n", (i+1), ptr[i], &ptr[i]);
    }

}

【问题讨论】:

  • 你的理解有误。无需将释放的内存替换为随机数。
  • 释放内存只是使其可用于将来的malloc 调用。没有做任何其他事情。
  • 好奇:您是如何想到fflush(stdin); 是一件好事?
  • 我在所有对scanf 的调用之后(或之前)都使用fflush(stdin),这样即使您一次输入多个数字(例如“10 20 22 33”)也只有第一个将读取数字(在本例中为“10”),其余的将被清除。如果我不使用它,ptr 的所有 3 个元素都可以用一个我不喜欢的键盘输入来设置。

标签: c free


【解决方案1】:

我的理解是,一旦内存被“释放”, 以前存储在那里的内容将被删除,取而代之的是 替换为一些随机数。

不,那不是真的。释放内存后,它就可用,您可以将其用于将来的任何内存分配。一旦内存被释放,内存就会被随机数替换。这是完全错误的。

【讨论】:

  • 哦,好的。那么,如果 free 除了让内存可用之外什么都不做,为什么前两个地址中存储的内容会被其他数字覆盖?
  • 当你做free时,内存可以被重用。例如,另一个 malloc 可以使用它(这里不是这种情况,给定您的代码)。此外,free 可以根据实现在块的开头写入信息 - 例如,检测版本可以写入有关调用文件和行号的信息,以帮助调试同一块内存的多个释放。或者它可能会将释放的内存链接到空闲列表,最终可能会使用先前分配的内存的开头。
【解决方案2】:

正如之前的海报所说,一旦释放内存,它就不会被随机覆盖。 如果你真的想要,Linux 内核的 PaX Patchset 有 CONFIG_PAX_MEMORY_SANITIZE 可以做到这一点。

【讨论】:

    【解决方案3】:

    一旦malloc()'ed 指针被释放,再次取消引用该指针是未定义的行为。

    返回的值可能和以前一样,也可能不同。程序可能出现段错误。很多可能性。行为未定义。

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      相关资源
      最近更新 更多