用户实现的内存管理

时间:2019-12-11 18:20:10

标签: c pointers memory-management

给我一​​个C项目任务,要求我实现一个简单的内存管理库。它的工作方式是它具有init函数,该函数将指向另一个c程序分配的内存块的指针(void *)连同该块的大小一起使用,并具有两个其他函数,用于从所述c分配请求的大小的块传回指向它的指针时,对块进行重新分配并取消分配。

问题是,我被要求将我的管理结构保留在该块本身中,而我对此却一无所知。我曾考虑过将块划分为多个帧,但是如何在不使用块外部的情况下跟踪分配哪些帧呢?

编辑:初始化函数的用法如下。有一个程序会调用我要编写的库。它将使用malloc或calloc分配一块内存。然后它将从库中调用init函数,并将指向该内存块的指针以及该块的大小传递给该内存块。

我的库将对该块执行的操作是按需分配其块。因此,我的库的allocate函数实际上是从块中请求一个内存块(大小作为参数传递)的调用。它将返回一个(void *)指针,指向已分配的内存块。

Edit2:为使情况更加清楚,我的库必须能够分配和解除分配,这意味着漏洞将出现在它管理的数据块中,并将采用最适合,最适合或最不适合的方式。

Edit3:有没有办法将内存地址转换为long int?

1 个答案:

答案 0 :(得分:3)

以下是您需要做什么的粗略想法:

应将内存段构造为块的链接列表。每个块都以管理结构的副本开头,然后是分配的内存。

在初始化时,将链接列表的开头指向给定内存段的开头。将大小设置为段的大小减去管理结构的大小,然后将下一个指针设置为NULL。

发出第一个分配请求时,将头块的大小设置为请求的大小,然后在此之后立即将下一个指针设置为内存。将新块的大小设置为旧磁头大小减去请求的大小以及管理结构的大小。

对于释放,您需要在要释放的块之前找到块。将前一个块的大小更改为已释放块的大小再加上结构大小,然后将下一个指针更改为已释放块的下一个指针。

这应该足以让您入门。