4

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

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

所以本质上,想象我的记忆是这样的

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

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

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

现在我已经有了这些洞,如果我想使用图表中的第一个间隙,我该如何设置它以便它也有一个头部(h)和一个身体(dd)?

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

metaStruct * mypointer = the memory address.

但是当我尝试做

mypointer->size = 30;

或者

mypointer->buddy = 1;

我得到一个段错误。

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

我该怎么做呢?

4

1 回答 1

4

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

所以我想你的“metaStruct”包含一个“size”字段,一个“next free area”字段和一个“data”字段,

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。

于 2011-03-26T10:47:17.860 回答