【问题标题】:Malloc/free own implementationmalloc/free 自己的实现
【发布时间】:2017-04-11 19:56:24
【问题描述】:

我目前正在尝试编写自己的 mallocfree 实现。

在我的研究过程中,我发现了一些要求免费memoryspace 的实现:

block = sbrk(totalSize);

还有一些其他的代码

最后他们return:

return (block + 1);

但我不明白为什么+ 1 是必要的。

另一件事我不明白为什么某些实现在他们的struct 中有一个magic number

我已经搜索了网络和 stackoverflow,但没有找到任何问题的答案。

【问题讨论】:

  • 为什么他们有一个幻数?没有看到实际的源代码很难说。 为什么会有+1?没有看到实际的源代码也很难分辨。
  • 另外,你听说过mmap吗?
  • 是的,我听说过mmap。为什么?
  • '因为使用mmap() 支持malloc() 存储更加灵活...

标签: c malloc free


【解决方案1】:

所以你从分配器返回了内存。一切都很好,用户用它做一些事情,并给你的free 一个指针。就是这样,你得到的只是一个地址。

你应该如何仅从一个地址知道:

  1. 一开始是你分配的?
  2. 你还没有释放它?
  3. 它指向的内存块有多大?

您必须在某处存储一些元数据。您描述的示例说明的方法是将元数据存储在您提供给malloc 调用者的原始内存之前。这样,要检索它,您只需使用您在free 中提交的地址进行简单的指针运算。

之后,存储什么元数据由您决定。幻数是记录下一个块是由您分配的一种方式。如果它的位模式足够“独特”,那么您很少会尝试释放您自己尚未分配的块。

【讨论】:

  • 此外,在示例中,在 cmets 中链接的 OP 似乎依赖于指针 block,由 sbrk() 返回的指针分配给它,是暗示命名的类型struct block_meta *。添加一个当然会导致一个指针指向刚刚过去的一个这样的结构。
【解决方案2】:

Story Teller 拥有大部分的....故事!双关语。

另外两点。首先,malloc() 经常错过的要求是返回对齐的内存。 malloc() 没有被告知它正在分配什么,因此需要返回一个具有“最大对齐”的块。 如果您的平台具有偶数对齐(2 字节对齐),而 int 之类的东西不能从奇数地址开始(或者只是效率不高),那么 +1 可能会四舍五入。尽管在这种情况下返回奇数长度的块没有多大意义。

其次,另一个智能调试功能是在块的末尾放置一些熟悉的模式来检查缓冲区结束覆盖(例如 out by 1 错误)。

我个人认为0xDEADC0D3 是一个很好的 4 字节块,但这是我的幽默感。

【讨论】:

    猜你喜欢
    • 2012-01-18
    • 1970-01-01
    • 2011-03-22
    • 2020-08-14
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2014-10-14
    相关资源
    最近更新 更多