编写新的“malloc”和“free”函数

时间:2013-02-06 08:49:01

标签: c++ c windows memory-management

对于面试问题:我如何编写新的“malloc”和“free”功能?我不认为“使用new和delete”是一个可接受的答案或使用类似LocalAlloc / HeapAlloc

之类的东西

7 个答案:

答案 0 :(得分:11)

由于这是一个面试问题,它可能没有“正确”的答案,而且他们对你的思考过程以及围绕这个主题的一般知识更感兴趣。

您应该要求澄清要求,或根据具体情况给出一系列答案。以下是需要考虑的一些问题:

  • 避免内存碎片是否重要?固定的分配大小可能有所帮助。
  • 您需要速度保证分配吗?使用已用/空闲块的索引。
  • 您是否需要轻松跟踪执行的分配?将日志记录结构添加到malloc / free库。
  • 您是否需要防止或检测内存/溢出?额外填充和定期填充检查。

答案 1 :(得分:3)

答案 2 :(得分:3)

简单地说,

您的malloc函数应该能够从操作系统获取内存并将其提供给请求动态分配内存的客户端(例如,您的C程序)。为了实现这一点,malloc库通常具有许多数据结构(取决于实现) - 例如,malloc实现可以选择使用链表来跟踪空闲的内存块。一种更有效的方法是获得一个链表的列表,每个链表包含一个特定尺寸范围的块。

我碰巧在TCMalloc图书馆工作,这可能会帮助您更清楚地理解这一点

Memory Allocation through free-lists

通过自由列表进行内存分配

让我们说,0类是一个大小为4k的空闲块的链表,类1是一个大小为8k的空闲块的链表,依此类推。

当调用malloc(比如大小为10k)时,你的malloc实现遍历 freelist 以找出满足请求的最小空闲块(在这种情况下, 4k块是不够的,所以它将获取一个8k块,将其从 freelist 中删除,然后将其返回给你的程序。)

类似地,当调用free时,您的实现(以及其他内容)应该从程序中回收该块并将其添加到适当的位置以添加到其中一个 freelists

答案 3 :(得分:3)

如果面试官问你

  

我如何编写新的“malloc”和“free”函数?

你开始谈论你要做什么,你已经失败了。在此之前,您需要提出几个问题才能更准确地使用malloc函数。最重要的是,我的一些问题是:

  • 哪个操作系统?
  • 哪个记忆?用户malloc或内核malloc?
  • 哪种情况最常用?万能的malloc?更适合大块或小块?

在开始讨论代码之前,需要先进行第一轮需求启发。

答案 4 :(得分:1)

这取决于要求,例如,您希望创建嵌入式软件,有时不允许在运行时或出于性能原因而执行malloc / free。然后,您可以创建自己的malloc / free版本,它不会分配/释放内存,而只是从预分配的堆中获取/重新构建块。

答案 5 :(得分:1)

如果您正在谈论挂钩malloc()free()来电,您可以这样做:

#define malloc(x) your_malloc(x)
#define free(x) your_free(x)

但是,如果您正在讨论创建自己的内存分配器,那么您可能需要查看Kernighan和Ritchie在他们的书“The C Programming Language 2nd Edition”中的堆分配器的一个实现。它基本上依赖于使用sbrk()系统函数来增加流程的数据段的大小。

答案 6 :(得分:0)

我猜他们可以/应该用另一种方式说出问题:“如何通过malloc和free管理堆内存?”。

然后你可以用稍微不同的方式来思考这个问题 - 给定一个线性值列表,你如何划分列表的块并跟踪它们,你如何给出该列表的块,你如何管理列表的碎片等。

简而言之,虽然下一个空闲块的地址存储在分配的块旁边的堆中,但是存储下一个空闲内存的信息对用户是不可见的,但仍然是同一堆的一部分。这就是为什么超越mallocated内存可以完全破坏堆并导致malloc和free等崩溃的原因。


通常情况下,面试官会使用这个问题给你免费的统治来证明你的知识。您可以从基本功能开始,然后如果您知道您的洋葱继续了解不同的操作系统如何管理它,不同的算法是什么等等。毕竟,无论您描述什么,都不太可能包含过去20年的R& D关于这个问题!