【问题标题】:Need help trying to understand how free() function works in C [duplicate]需要帮助尝试了解 free() 函数在 C 中的工作原理 [重复]
【发布时间】:2017-03-04 05:16:48
【问题描述】:

我一直在运行一些测试,试图了解free() 函数的工作原理。这是我的代码,后面是一些基于我理解的问题。

int n=0,i=0;
scanf("%d",&n);
int *A = (int*)malloc(n*sizeof(int));
for (i=0;i<n;i++)
{
    A[i]=2*i;
    printf("A[%d] = %d\n",i,*(A+i));

}
printf("Address of A is = %d\n",A);
free(A);
for (i=0;i<n;i++)
{
    printf("%d\n",*(A+i));

}
printf("Address of A is = %d\n",A);

我不明白为什么free(A)之后,A的值还是一样的?免费后不应该有一些垃圾价值吗?为什么A的地址保持不变?释放 A 的内存后究竟发生了什么?

【问题讨论】:

  • 为什么不应该这样呢?如果你把垃圾放进罐子里,它不会消失,直到推车把它拿走,或者邻居用一些石头代替它。 free 不会故意丢弃已释放的内存。当其他一些进程被分配相同的内存时,就会发生这种情况。 A 的地址也保持不变。 free 无法改变这一点。如果你想让它失效,你必须自己分配A = NULL
  • 但我不明白的是,为什么你要访问你告诉系统不再属于你的内存,并期待任何有意义的结果。
  • 您为什么希望内存发生变化?如果您从记事本中取出一张纸,在上面写下便条,然后将纸扔进垃圾桶,那么便条上的文字不会神奇地从页面上消失。
  • 请注意,打印指针的正确方法使用"%p" 转换规范(并将参数转换为void *),或使用转换为uintptr_t(来自&lt;inttypes.h&gt;)和转换规范,例如"0x%.16" PRIXPTR。只有在 sizeof(int) == sizeof(void *) 时才使用 %d,这在 32 位系统上通常是正确的。
  • @KenWhite:这个类比可以进一步扩展,它仍然有效 - 文字不会消失,但是如果你扔掉这么大的纸条,你必须清空垃圾桶(将内存返回到操作系统),它也可能有。纸条上可能还有字迹,但您无法阅读,因为它在垃圾车(操作系统管理的内存池)内,而垃圾人不会让您爬进去检查(您没有读取权限到您的进程不拥有的内存)。如果您尝试,他们的垃圾人会毫无意义地殴打您(段错误)。 :-)

标签: c pointers malloc free


【解决方案1】:

free 将内存返回到堆中。它没有说明它对内存内容做了什么,实际上,通常的行为是“它不做任何事情”(也就是说,它不执行数据本身的读取或写入,只是更新堆跟踪信息以将该内存标记为可重用或将其返回给操作系统)。

不过,你不应该依赖这个; use-after-free 是未定义的行为,因此它可以做任何它想做的事情。在实践中,释放后立即读取大分配可能会出现段错误,而小分配将继续工作,直到新的 mallocs 重新使用空间,但 您不能依赖任何这些,它是系统和使用模式特定的.

如果你访问freed 内存,你就做错了,它最终会咬你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2016-08-28
    • 2018-10-06
    相关资源
    最近更新 更多