我想写自己的内存管理器。目标语言是C ++,内存管理器的目标主要是帮助调试。它应该检测双重释放,内存覆盖等。当然 - 我想学习内存管理。
有人可以给我一些提示,以便我可以学习如何编写这样的内存管理器吗?
感谢您的帮助。
答案 0 :(得分:32)
我认为这是一个非常有趣的项目,您可以从中学到很多东西。这里有一些关于内存管理主题的阅读材料。它介绍了一些内存管理的基础知识,引入了一个简单的malloc实现,然后涉及了一些更高级的主题。
另外,既然你提到要创建一个对调试很有用的内存管理器,你可能需要考虑Memcheck / Valgrind(一个很棒的Linux内存调试器)开发人员阅读本文。它详细说明了如何跟踪memchck中的所有元数据(无论是否定义了特定字节,初始化等)。它有点详细,但是如何制作可扩展且高效的动态内存检查器是很好的阅读。
答案 1 :(得分:4)
Dave Hanson的C Interfaces and Implementations首先提供标准内存管理器,然后是具有一些调试功能的内存管理器。这将是一个很好的学习和扩展的起点。
当然,如果您确实想要在正在运行的C或C ++程序中诊断内存问题,则应使用valgrind
。
答案 2 :(得分:2)
我看到一些示例使用C {预处理器宏来表示malloc
。这是一个聪明的主意。我相信你可以写出类似的东西。
这是一个很好的起点。
答案 3 :(得分:1)
用Delphi编写了一个很棒的开源内存管理器:fastMM4。看看它可能很有价值。它支持您要实现的许多功能,因此可能是一个很好的展示。
答案 4 :(得分:1)
正如@Spence所说,这已经做了很多次。但为了学习,这很有意思。
我建议你看一下ld's --wrap Here因为它很有用
答案 5 :(得分:0)
你可以用malloc和free实现大部分内容 - 实际上很多C ++内存管理器都已实现,即使它们不是必须的。
您可以从一个简单的实现开始,该实现维护所有分配和解除分配的日志,但是将常规分配/解除分配转发到malloc和free。显然,简单的实现不应该使用new / delete ...
所以,开始你可以
答案 6 :(得分:0)
我认为您可以从智能指针实现开始,该实现在后台使用基本引用计数。这些是内存管理的基础知识,将让您的脚步受到影响。从那里,您可以使用您的实现来创建更高级的内存管理器。
答案 7 :(得分:0)
“电围栏”是一个可能有用的基本起点。从本质上讲,它具有malloc和free的自定义实现,可以提供调试。
然而,AFAIK,它并没有集成到C ++的新/删除操作符中,尽管提供自定义的全局新/删除实现并不是太大了,不遵守电子围栏例程。
答案 8 :(得分:-2)
你的平台是什么?在你去尝试重新实现厨房水槽之前,想想valgrind或者lint是否能够帮助你?