C中的内存分配器 - 如何利用sbrk()的ed空间

时间:2011-03-26 10:19:31

标签: c pointers memory-management malloc sbrk

我一直在编写malloc的实现,并且想知道是否有人可以帮我解决这个问题。

基本上,我想在使用sbrk()分配内存后重用内存,并确保内存是空闲的。

基本上,想象一下我的记忆就像这样

|------------------------------|

......我做了一些分配。当我分配内存时,每个位都有一个头(h)和数据(d)。

|hddddddhddd---hdd--hddd-------|

现在我已经有了这些漏洞,如果我想使用说法,我的图表中的第一个空白,我如何设置它以便它还有一个头(h)和一个主体(dd)呢? / p>

我已经到了现在我有一个指向我想要的内存位置的指针。在C中,它指向一个指针。指针有一个自定义类型,其中“meta”是我定义的结构。所以现在我有了

metaStruct * mypointer = the memory address.

但是当我尝试做的时候

mypointer->size = 30;

或者

mypointer->buddy = 1;

我遇到了段错误。

问题:如何设置它以便通过sbrk()分配的内存地址将具有我的结构形式?显然我不能只是去myPointer = malloc(sizeof(metaStruct)),因为我正在编写malloc本身。我也对sbrk()更多的空间感兴趣,而是利用我指向的现有空间(我想忽略它的垃圾数据并使用空间)。

我该怎么做?

1 个答案:

答案 0 :(得分:4)

据我所知,p = sbrk(n)扩大了(至少)n个字节的可用地址空间,并以“p”的形式返回新分配区域的基地址。所以你现在有一块内存从“p”开始,n个字节长(可能大于n,它取决于系统)。

所以我想你的“metaStruct”包含一个“大小”字段,一个“下一个空闲区域”字段和一个“数据”字段,

metaStruct * m ;
p=sbrk(sizeof(metaStruct)+ data_size);
m = (metaStruct *)p;
m->size = data_size;
m->next = NULL;
memcpy(m->data, ...,data_size);

代码并不完美,在某些系统上sbrk函数(实际上它通常是函数,而不是基本的系统调用 - 当然你应该检查sbrk是否失败)不会返回对齐的指针,所以你必须对齐手动指针。此外,您可以通过在sbrk(n)之后调用sbrk(0)并计算两个指针之间的差异来获得实际分配的大小。一般来说,你应该维护一个“免费积木”的集合,并尝试用它们拳头,然后只有当它们都不够大时才调用sbrk。