编写自己的内存管理器

时间:2009-07-28 14:28:29

标签: c++ memory-management

我想写自己的内存管理器。目标语言是C ++,内存管理器的目标主要是帮助调试。它应该检测双重释放,内存覆盖等。当然 - 我想学习内存管理。

有人可以给我一些提示,以便我可以学习如何编写这样的内存管理器吗?

感谢您的帮助。

9 个答案:

答案 0 :(得分:32)

我认为这是一个非常有趣的项目,您可以从中学到很多东西。这里有一些关于内存管理主题的阅读材料。它介绍了一些内存管理的基础知识,引入了一个简单的malloc实现,然后涉及了一些更高级的主题。

Inside memory management

另外,既然你提到要创建一个对调试很有用的内存管理器,你可能需要考虑Memcheck / Valgrind(一个很棒的Linux内存调试器)开发人员阅读本文。它详细说明了如何跟踪memchck中的所有元数据(无论是否定义了特定字节,初始化等)。它有点详细,但是如何制作可扩展且高效的动态内存检查器是很好的阅读。

How to Shadow Every Byte of Memory Used by a Program

答案 1 :(得分:4)

Dave Hanson的C Interfaces and Implementations首先提供标准内存管理器,然后是具有一些调试功能的内存管理器。这将是一个很好的学习和扩展的起点。

当然,如果您确实想要在正在运行的C或C ++程序中诊断内存问题,则应使用valgrind

答案 2 :(得分:2)

我看到一些示例使用C {预处理器宏来表示malloc。这是一个聪明的主意。我相信你可以写出类似的东西。

这是一个很好的起点。

http://stevehanov.ca/blog/index.php?id=10

答案 3 :(得分:1)

用Delphi编写了一个很棒的开源内存管理器:fastMM4。看看它可能很有价值。它支持您要实现的许多功能,因此可能是一个很好的展示。

答案 4 :(得分:1)

正如@Spence所说,这已经做了很多次。但为了学习,这很有意思。

我建议你看一下ld's --wrap Here因为它很有用

答案 5 :(得分:0)

你可以用malloc和free实现大部分内容 - 实际上很多C ++内存管理器都已实现,即使它们不是必须的。

您可以从一个简单的实现开始,该实现维护所有分配和解除分配的日志,但是将常规分配/解除分配转发到malloc和free。显然,简单的实现不应该使用new / delete ...

所以,开始你可以

  • 提出记录分配和解除分配的数据结构
  • 实现它主要是“C风格”,尽管您可以使用placement new来确保构造函数被称为
  • 实现全局new和delete作为包装器,首先在上述数据结构中记录访问权限,然后将调用转发给malloc或free

答案 6 :(得分:0)

我认为您可以从智能指针实现开始,该实现在后台使用基本引用计数。这些是内存管理的基础知识,将让您的脚步受到影响。从那里,您可以使用您的实现来创建更高级的内存管理器。

答案 7 :(得分:0)

“电围栏”是一个可能有用的基本起点。从本质上讲,它具有malloc和free的自定义实现,可以提供调试。

然而,AFAIK,它并没有集成到C ++的新/删除操作符中,尽管提供自定义的全局新/删除实现并不是太大了,不遵守电子围栏例程。

答案 8 :(得分:-2)

你的平台是什么?在你去尝试重新实现厨房水槽之前,想想valgrind或者lint是否能够帮助你?