【发布时间】:2010-11-14 17:37:31
【问题描述】:
我想编写自己的内存管理器。目标语言是 C++,内存管理器的目标主要是帮助调试。它应该检测双重释放、内存覆盖等。当然 - 我想了解内存管理。
谁能给我一个提示,以便我可以学习如何编写这样一个内存管理器的资源?
感谢您的帮助。
【问题讨论】:
标签: c++ memory-management
我想编写自己的内存管理器。目标语言是 C++,内存管理器的目标主要是帮助调试。它应该检测双重释放、内存覆盖等。当然 - 我想了解内存管理。
谁能给我一个提示,以便我可以学习如何编写这样一个内存管理器的资源?
感谢您的帮助。
【问题讨论】:
标签: c++ memory-management
我认为这是一个非常有趣的项目,您可能会从中学到很多东西。这里有一些关于内存管理主题的阅读材料。它介绍了一些内存管理的基础知识,介绍了一个简单的 malloc 实现,然后涉及一些更高级的主题。
此外,由于您提到您想要创建一个对调试有用的内存管理器,您可能需要考虑阅读 Memcheck/Valgrind 开发人员的这篇论文(适用于 Linux 的出色内存调试器)。它详细说明了它们如何跟踪 memchck 中的所有元数据(无论是否定义、初始化了特定字节等)。它有点详细,但它是关于如何制作可扩展且高效的动态内存检查器的好读物。
【讨论】:
Dave Hanson 的C Interfaces and Implementations 首先介绍了一个标准内存管理器,然后是一个带有一些调试功能的内存管理器。这将是一个很好的学习和扩展起点。
当然,如果你真的想诊断正在运行的 C 或 C++ 程序中的内存问题,你应该使用valgrind。
【讨论】:
“电围栏”是一个可能有用的基本起点。本质上,它具有提供调试的 malloc 和 free 的自定义实现。
然而,AFAIK,它并没有集成到 C++ 的 new/delete 操作符中,尽管提供遵循电子围栏例程的自定义全局 new/delete 实现并不会太大。
【讨论】:
我认为您可以从在后台使用基本引用计数的智能指针实现开始。这些是内存管理的基础知识,会让你大吃一惊。从那里您可以使用您的实现来制作更高级的内存管理器。
【讨论】:
正如@Spence 所说,这已经做过很多次了。但是为了学习,还是蛮有意思的。
我建议你看看 ld 的 --wrap Here 因为它很有用
【讨论】:
您可以通过 malloc 和 free 实现其中的大部分 - 事实上,很多 C++ 内存管理器都已实现,即使它们不是必须的。
您可以从一个简单的实现开始,它维护所有分配和解除分配的日志,但将常规分配/解除分配转发给 malloc 和 free。显然,简单的实现也不应该使用 new/delete...
所以,你可以开始
【讨论】:
有一个很棒的用 Delphi 编写的开源内存管理器:fastMM4。看看它可能是有价值的。它支持您想要实现的许多功能,因此可能是一个很好的展示。
【讨论】:
你的平台是什么?在你去尝试重新实现厨房水槽之前,只是想一想 valgrind 或 lint 是否能帮助你?
【讨论】:
我看到一些示例对malloc 使用了 C 预处理器宏。这是一个聪明的主意。我相信你可以写出这样的东西。
这是一个看起来不错的起点。
【讨论】: