我目前正在尝试编写自己的malloc
和free
实现。
在我的研究过程中,我发现了一些请求免费memoryspace
的实现:
block = sbrk(totalSize);
然后还有一些其他代码
最后他们return
:
return (block + 1);
但我不明白为什么+ 1
是必要的。
另一件事我不明白为什么某些实现在magic number
中有struct
。
我已经搜索了网络和stackoverflow,但没有找到我的问题的任何答案。
答案 0 :(得分:5)
所以你从你的分配器返回了内存。一切都很好,用户用它做了一些事情,并给你free
一个指针。就是这样,你得到的只是一个地址。
你怎么能从一个地址知道:
您必须在某处存储某些元数据。您描述的示例所示的方法是将元数据存储在您为调用者malloc
提供的原始内存之前。这样,要检索它,您只需要使用free
提交的地址进行简单的指针算术。
之后,要存储的元数据取决于您。幻数是记录您分配以下块的一种方法。如果它的位模式足够"不同"那么你很少会尝试释放你自己没有分配过的障碍。
答案 1 :(得分:2)
另外两点。首先,malloc()
经常错过的要求是返回对齐的内存。 malloc()
没有被告知它的分配是什么,所以需要返回一个具有“最大对齐”的块。
如果您的平台具有均匀对齐(2字节对齐),而int
之类的内容无法在奇数地址上启动(或者效率不高),那么+1
可能会向上舍入。虽然在这种情况下永远不会返回一个奇数长度的块是没有多大意义的。
其次,另一个智能调试功能是在块的末尾放置一些熟悉的模式来检查缓冲区结束覆盖(例如,输出1个错误)。
我个人认为0xDEADC0D3
是一个4字节的好块,但那是我的幽默感。