【问题标题】:Can I free() by referencing an offset pointer? [duplicate]我可以通过引用偏移指针来释放()吗? [复制]
【发布时间】:2011-01-20 08:11:49
【问题描述】:

可能重复:
Does the pointer passed to free() have to point to beginning of the memory block, or can it point to the interior?

我正在使用malloc() 在堆上分配一些内存。我正在给指针添加一个偏移量并将其返回给调用函数return ptr+(sizeof(char)*4)),例如,此返回值存储在ptrReturned 中。

最大的问题是,当我free(ptrReturned) 与分配块的开头偏移sizeof(char)*4 时,会释放整个块还是从偏移量到分配的末尾释放内存堵塞?我使用的编译器是MSVC++2008。

如果分配的地址存储在一个链表中,并且有指向前一个项目的指针,那么它应该将整个块从前一个指针为 NULL 的位置释放到下一个指针为 NULL 的位置,对吗?

我已经尝试调试和观察内存,但我无法让它覆盖已释放的块空间。有没有办法可以显式地尝试在定义的地址处分配堆上的空间,并且可能会在尝试分配已分配的内存时出现异常?这样我就可以知道,如果有,当然,没有更简单的答案。

我希望问题很清楚,如果我缺少某些信息,请在 cmets 中告诉我。谢谢。

【问题讨论】:

  • 我们不会因为问题是骗子就删除它们。骗子也不是那么糟糕。搜索者有更多机会找到他们想要的东西。

标签: c memory-management malloc heap-memory free


【解决方案1】:

您必须将与 malloc() 返回的指针值相同的指针值传递给 free(),否则您的程序将出现未定义的行为。您期望它可能释放全部或部分分配的块是没有根据的。

【讨论】:

  • 我在某处读到内存管理器的 MSVC++ 实现将检查添加到块的前后的几个字节,以确保您在使用时没有溢出它。
  • @Soulseekah:这仍然是 C 标准未定义的行为。
【解决方案2】:

我从标准中找到了以下引用:

否则,如果参数不 匹配早先返回的指针 calloc、malloc 或 realloc 功能,或者如果空间已经 通过调用 free 或 realloc,行为未定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    相关资源
    最近更新 更多