【问题标题】:Overriding memory allocation method standard libraries use?覆盖标准库使用的内存分配方法?
【发布时间】:2013-04-20 07:18:03
【问题描述】:

是否可以覆盖 STL 分配、管理和释放内存的方式?如果可能的话,如何做到这一点?有没有办法将处理原始内存的代码保留在一个类或文件中?

我想为我的整个程序执行此操作,以便跟踪内存使用情况、时间和生命周期信息。当然纯粹出于好奇!

【问题讨论】:

  • 是的...这很困难...而且是的...你能用valgrind实现同样的目标吗?
  • 如果你在linux上,你可以看看man(2) brk和sbrk。不过在 Windows 上不知道。
  • 你必须替换运营商 newdelete ,所以运行 - 而不是步行 - 到书店并获得 Effective C++ 的第 8 章

标签: c++ memory-management stl


【解决方案1】:

您可以通过在其中一个文件中重新定义运算符 newdelete 来做到这一点。

在解析符号时,链接器将覆盖您的标准链接器。

你会在 SO 上找到很多很多答案,比如这个:overloading new/delete 或那个:How to track memory allocations in C++ (especially new/delete)

互联网上也有一些库可以为您执行此操作,例如 Memtrackthis one 。 SO 对此也有一些资源:C++ memory leak auto detection library

【讨论】:

    【解决方案2】:

    管理具有动态存储持续时间的数据的标准库类将allocator 作为其模板参数之一。然后该类将调用分配器的实例以进行内存管理。例如,您可以使用std::vector<int, MyAllocator> somevec;std::list<Node*, MyAllocator> someList; 为容器提供自定义分配器。

    这是SO Q&A about allocators。链接指向的答案包括分配器的骨架代码,这对您来说应该是一个很好的起点。

    【讨论】:

    • 啊,没错,我忘了分配器是一个模板参数。我依稀记得它们被描述为复杂的代码事务,但我会试一试
    • 实际上一个基本的分配器很容易制作。查看我的答案中包含的链接中概述的要求。这里还有一些用于创建标准库兼容分配器的框架代码 - stackoverflow.com/a/12529302/845568 - 这对你来说应该是一个不错的开始。
    猜你喜欢
    • 2013-12-09
    • 2023-03-17
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    相关资源
    最近更新 更多