【问题标题】:Write your own memory manager [closed]编写自己的内存管理器 [关闭]
【发布时间】:2010-11-14 17:37:31
【问题描述】:

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

谁能给我一个提示,以便我可以学习如何编写这样一个内存管理器的资源?

感谢您的帮助。

【问题讨论】:

    标签: c++ memory-management


    【解决方案1】:

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

    Inside memory management

    此外,由于您提到您想要创建一个对调试有用的内存管理器,您可能需要考虑阅读 Memcheck/Valgrind 开发人员的这篇论文(适用于 Linux 的出色内存调试器)。它详细说明了它们如何跟踪 memchck 中的所有元数据(无论是否定义、初始化了特定字节等)。它有点详细,但它是关于如何制作可扩展且高效的动态内存检查器的好读物。

    How to Shadow Every Byte of Memory Used by a Program

    【讨论】:

      【解决方案2】:

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

      当然,如果你真的想诊断正在运行的 C 或 C++ 程序中的内存问题,你应该使用valgrind

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          我认为您可以从在后台使用基本引用计数的智能指针实现开始。这些是内存管理的基础知识,会让你大吃一惊。从那里您可以使用您的实现来制作更高级的内存管理器。

          【讨论】:

            【解决方案5】:

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

            我建议你看看 ld 的 --wrap Here 因为它很有用

            【讨论】:

            • 这是拦截 new() 和 delete() 调用的非常好的第一步。请参阅 Falaina 关于检测阵列溢出的复杂性的帖子——另一种野兽
            【解决方案6】:

            您可以通过 malloc 和 free 实现其中的大部分 - 事实上,很多 C++ 内存管理器都已实现,即使它们不是必须的。

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

            所以,你可以开始

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                • 当然 - 但我不会学到任何东西。
                • 通过使用 Valgrind 发现漏洞,您不会学到任何编码技术方面的知识吗?当然,如果您使用有缺陷的方式来破坏对象(或根据您的平台释放),那么您很快就会发现。我确实看到了实现堆等的价值,看看它是如何完成的,但它本身需要付出很多努力才能正确地完成它,当你遇到问题时,它会给你留下更多需要调试的东西。
                • 如果我是为了工作而做的——你是绝对正确的。没有理由重新实现轮子。但是为了乐趣和学习,仅仅使用 valgrind 并不能带来洞察力和乐趣。但我很欣赏你思考 Spence 的方式。如果您开始编程,您应该做的第一件事是检查是否有人已经完成了您的工作。大多数时候他们做得比你做得更好。
                • 为了好玩而使用 API 并没有错。如果我没有研究过 SqlBulkCopy,那么我就不会在工作中解决问题。我想如果你因为内存泄漏而被困在工作中,那么我想确保你知道 valgrind 提供的快乐(或痛苦......)。
                【解决方案9】:

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

                这是一个看起来不错的起点。

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-09-18
                  • 2011-05-03
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-03-03
                  • 1970-01-01
                  相关资源
                  最近更新 更多