【发布时间】:2020-04-05 02:14:39
【问题描述】:
我被分配了一个 C 项目任务,要求我实现一个简单的内存管理库。它的工作方式是它具有 init 函数,该函数将指针(void *)指向另一个 c 程序分配的内存块以及块的大小,并具有其他两个函数来从所述分配请求大小的块当传回指向它的指针时分块并释放一个块。
问题是我被要求将我的管理结构保留在块本身内,而我对如何做到这一点的想法为零。我考虑过将块划分为帧,但是如何在不使用块外部的任何内容的情况下跟踪分配了哪些帧?
编辑:初始化函数是这样使用的。有这个程序将调用我要编写的库。它将使用 malloc 或 calloc 分配一块内存。然后它将调用库中的 init 函数并将指向该内存块的指针以及块的大小传递给它。
我的库将使用该块做什么是按需分配块。所以我的库的分配函数实际上是从块中请求一块内存(大小作为参数传递)的调用。并且它会返回一个 (void *) 指向分配的内存块的指针。
Edit2:为了使情况更清楚,我的库必须能够分配和解除分配,这意味着漏洞将出现在它正在管理的块中,并且它将采用首次拟合、最佳拟合或最差拟合。
Edit3:有没有办法将内存地址转换为 long int?
【问题讨论】:
-
这就是常见的
malloc实现的工作方式。尝试阅读它。 -
谨慎措辞。你说“由另一个 C 程序分配的一块内存”——这在那儿很不寻常。如果另一个程序分配内存块,它必须是共享内存(或者它将是在
fork()之前分配的内存并在exec*()操作之前由子进程继承)。否则,您无法直接访问另一个进程分配的内存。我不确定你的意思是“其他 C 函数”还是其他东西。但是内存管理器的基本过程通常是分配大块并按需分配较小的块。 -
@Eugene Sh.我做到了。它没有帮助。
-
您是否至少允许块外的一两个指针知道内存列表从哪里开始?我会假设是这样,但你应该仔细检查。
-
此外,每个分配的内存块的页眉(或页脚)位于返回给用户的指针之外是一种非常常见的方法。有人想要 32 字节,你分配
sizeof(YourHeader)+32字节,将链表设置为阻塞或其他,然后返回指向允许用户使用的区域的指针。
标签: c pointers memory-management