【问题标题】:Range of free on malloc returned memory [duplicate]malloc 返回内存上的可用范围 [重复]
【发布时间】:2015-09-30 02:21:42
【问题描述】:

鉴于以下行:

 int *digits = (int *) malloc(3 * sizeof(int));

假设我们将值 1、2 和 3 存储在位置,digits[0]、digits[1]、digits[2]。如下:

digits[0] = 1;
digits[1] = 2;
digits[2] = 3;

如果调用以下行:

free(++digits);

是释放了 malloc 返回的整个内存范围,还是只是 digits 当前指向的 int 大小的块 - 当时,digits[1] ?或者是正确的方法,通过迭代释放整个范围,即:

for (i = 0; i < 3; i++)
{
    free(digits[i]);
}

我正在尝试了解对 free 的调用范围。 malloc 返回的整个内存块是否已释放,或者只是当前由指针 digits 引用的子部分已释放?

【问题讨论】:

标签: c pointers memory-management malloc


【解决方案1】:

free() 必须与从 malloc() 获得的指针值完全相同。由malloc() 分配的整个内存块将立即被释放。

你不能使用malloc()返回给你的缓冲区中间的指针到free()它,但你必须将malloc()返回给你的内容传递给free()

http://linux.die.net/man/3/malloc 对此非常明确。

【讨论】:

  • 哦,你只能释放一次。再做一次是不确定的。释放先前 malloc 未返回的指针是未定义的。不要激怒堆。如果你这样做,它会以最狡猾的方式对待你。
  • 当你说:“你不能指向它的中间”。这是否意味着不应使用赋值语句digits[0] = 1, digits[1] = 2, digits[2] = 3
  • 我的意思是,你可以释放一个不同的指针。这只是那些“未定义行为”场景之一,语言规范明确允许程序放火烧你的房子并绑架你的孩子。 :-) 更严重的是,大多数malloc 实现在它们返回的指针之前 立即存储分配元数据;如果您将指针的偏移量传递给free,它会将分配的早期部分解释为分配元数据,而它绝对不是,这就是您如何回到烧焦的废墟和来自ISO C 委员会。
  • @crypitc 您保证能够从malloc() 返回的任何地址以及请求的长度进行读/写。您只能将malloc() 给您的值传递给free()
  • C 标准的措辞比 linux 联机帮助页恕我直言。 “如果 ptr 是空指针,则不会发生任何操作。否则,如果参数与内存管理函数先前返回的指针不匹配,或者如果空间已通过调用 free 或 realloc 被释放,则行为未定义。 " (第 7.22.3.3 节第 2 段)
【解决方案2】:

根据规则 malloc 为您提供您需要的内存块并返回您该块的起始地址。您必须使用 digit 来释放内存,因为识别分配的内存的唯一合法方法是在您的情况下返回的指针是数字

【讨论】:

  • 您不必使用digits。您可以将digits 分配给任何其他事物,只要将malloc() 返回的值传递给free()。任何包含malloc() 返回值的指针变量都可以。
  • 是的,如果他分配给其他东西,但问题很简单,是使用数字还是++数字。为了清楚起见,我尝试仅在该域中回答
猜你喜欢
  • 1970-01-01
  • 2013-08-22
  • 2011-01-16
  • 2016-07-11
  • 2016-02-28
  • 1970-01-01
  • 2011-07-28
相关资源
最近更新 更多