Malloc/free 自己的实现
Malloc/free own implementation
我目前正在尝试编写自己的 malloc
和 free
.
实现
在我的研究过程中,我发现了一些实现,它请求免费 memoryspace
与:
block = sbrk(totalSize);
还有一些其他代码
最后他们 return
:
return (block + 1);
但我不明白为什么 + 1
是必要的。
另一件事我不明白为什么有些实现在他们的 struct
中有一个 magic number
。
我已经在网上和 Whosebug 上进行了搜索,但没有找到我的问题的任何答案。
所以你从你的分配器返回了内存。一切都很好,用户用它做了一些事情,并给你的 free
一个指针。就是这样,你得到的只是一个地址。
你怎么能仅从一个地址就知道:
- 原来是你分配的?
- 你还没有释放它?
- 它指向的内存块有多大?
您必须在某处存储一些元数据。您描述的示例说明的方法是将元数据存储在您提供给 malloc
的调用者的原始内存之前。这样,要检索它,您所要做的就是使用您提交的地址进行简单的指针运算 free
.
之后,要存储什么元数据由您决定。幻数是记录下一个块由您分配的一种方式。如果它的位模式足够 "distinct" 那么你将很少尝试释放你自己没有分配的块。
Story Teller 拥有大部分 .... 故事!双关语。
另外两点。首先,malloc()
的一个经常被遗漏的要求是 return 对齐内存。 malloc()
没有被告知它正在分配什么,因此需要 return 一个带有 "the maximum alignment" 的块。
如果您的平台具有偶数对齐(2 字节对齐),其中 int
之类的东西不能从奇数地址开始(或者只是效率不高),那么 +1
可能会四舍五入。尽管在那种情况下 return 一个奇数长度的块没有多大意义。
其次,另一个智能调试功能是在块的末尾放置一些熟悉的模式来检查缓冲区末尾覆盖(例如 out by 1 errors)。
我个人认为 0xDEADC0D3
是一个不错的 4 字节块,但这是我的幽默感。
我目前正在尝试编写自己的 malloc
和 free
.
在我的研究过程中,我发现了一些实现,它请求免费 memoryspace
与:
block = sbrk(totalSize);
还有一些其他代码
最后他们 return
:
return (block + 1);
但我不明白为什么 + 1
是必要的。
另一件事我不明白为什么有些实现在他们的 struct
中有一个 magic number
。
我已经在网上和 Whosebug 上进行了搜索,但没有找到我的问题的任何答案。
所以你从你的分配器返回了内存。一切都很好,用户用它做了一些事情,并给你的 free
一个指针。就是这样,你得到的只是一个地址。
你怎么能仅从一个地址就知道:
- 原来是你分配的?
- 你还没有释放它?
- 它指向的内存块有多大?
您必须在某处存储一些元数据。您描述的示例说明的方法是将元数据存储在您提供给 malloc
的调用者的原始内存之前。这样,要检索它,您所要做的就是使用您提交的地址进行简单的指针运算 free
.
之后,要存储什么元数据由您决定。幻数是记录下一个块由您分配的一种方式。如果它的位模式足够 "distinct" 那么你将很少尝试释放你自己没有分配的块。
Story Teller 拥有大部分 .... 故事!双关语。
另外两点。首先,malloc()
的一个经常被遗漏的要求是 return 对齐内存。 malloc()
没有被告知它正在分配什么,因此需要 return 一个带有 "the maximum alignment" 的块。
如果您的平台具有偶数对齐(2 字节对齐),其中 int
之类的东西不能从奇数地址开始(或者只是效率不高),那么 +1
可能会四舍五入。尽管在那种情况下 return 一个奇数长度的块没有多大意义。
其次,另一个智能调试功能是在块的末尾放置一些熟悉的模式来检查缓冲区末尾覆盖(例如 out by 1 errors)。
我个人认为 0xDEADC0D3
是一个不错的 4 字节块,但这是我的幽默感。