代码之家  ›  专栏  ›  技术社区  ›  Tobias Langner

编写自己的内存管理器[关闭]

  •  21
  • Tobias Langner  · 技术社区  · 16 年前

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

    有人能给我一个提示,让我在哪里可以学习如何编写这样的内存管理器?

    谢谢你的帮助。

    9 回复  |  直到 12 年前
        1
  •  32
  •   Christian    12 年前

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

    Inside memory management

    另外,由于您提到要制作一个对调试有用的内存管理器,您可能需要考虑由memcheck/valgrind(一个非常好的Linux内存调试器)的开发人员阅读本文。它详细描述了它们如何跟踪memchck中的所有元数据(无论是否定义了特定的字节、初始化等)。它有点详细,但对于如何创建一个可扩展和高效的动态内存检查器来说,它是一个很好的读物。

    How to Shadow Every Byte of Memory Used by a Program

        2
  •  4
  •   Norman Ramsey    16 年前

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

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

        3
  •  2
  •   Daniel A. White    16 年前

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

    这是一个很好的起点。

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

        4
  •  1
  •   Ralph M. Rickenbach    16 年前

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

        5
  •  1
  •   Salgar    16 年前

    正如@spence所说,这已经做了很多次了。但是为了学习它是相当有趣的。

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

        6
  •  0
  •   Timo Geusch    16 年前

    你可以用Malc和Field-实现大部分的——事实上,很多C++内存管理器都被实现了,即使它们不是必须的。

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

    所以,首先你可以

    • 提出记录分配和释放的数据结构
    • 实现它主要是“C样式”,尽管可以使用placement new来确保调用构造函数
    • 实现全局新建和删除作为包装器,首先将访问记录在上述数据结构中,然后将调用转发到malloc或free
        7
  •  0
  •   DigitalZebra    16 年前

    我认为您可以从一个智能指针实现开始,它在后台使用基本的引用计数。这些是记忆管理的基础知识,会让你的脚湿透的。从那里,您可以使用您的实现来创建一个更高级的内存管理器。

        8
  •  0
  •   Michael Burr    16 年前

    “电子围栏”是一个可能有帮助的基本起点。本质上,它有malloc和free的定制实现,提供调试。

    然而,AFAIK,它不集成到C++的NeX/DELT运算符中,尽管提供定制的全局新的/Delphi实现也不算太大,可以推迟到电篱笆例程。

        9
  •  -2
  •   Spence    16 年前

    你的讲台是什么?想一想,在你去重新安装厨房水槽之前,Valgrind或Lint是否能帮助你?