【问题标题】:How to overload operator new and delete to track memory?如何重载 operator new 和 delete 以跟踪内存?
【发布时间】:2016-09-27 22:21:38
【问题描述】:

我想通过重载 new/delete 来跟踪内存以检查泄漏和检查内存消耗(peek 等)。

但是,我注意到有时调用了一个 delete 而没有相应的 new (即使在使用 boost 的代码行数很少的简单程序上),看起来可以从另一种方式获取内存(malloc ?)并且删除后很高兴将其释放。这会给我带来一些问题,因为我需要通过分配来存储信息(大小)。

我已经重载了以下方法,是否缺少一个函数?或者这是我的 c++ 编译器/增强版本的错误?

void * operator new( size_t size );
void * operator new( size_t size, const std::nothrow_t& ) noexcept;
void * operator new[]( size_t size );
void * operator new[]( size_t size, const std::nothrow_t& ) noexcept;

void operator delete( void* ptr);
void operator delete[]( void* ptr);
void operator delete( void* ptr, const std::nothrow_t&) noexcept;
void operator delete[]( void* ptr, const std::nothrow_t&) noexcept;

我在 windows 和 mingw-w64 gcc 下运行,所以我更喜欢使用“代码”解决方案而不是特定工具解决方案(“valgrind 不可用),这也将使我几乎可以正常运行程序。

【问题讨论】:

    标签: c++ c++11 boost mingw-w64


    【解决方案1】:

    Microsoft 标准库有时直接使用内部分配函数,而不是通过运算符。而且并不总是一致的。几年前,我尝试过使用DUMA,但是当流开始失败时,我就放弃了,因为正是您所看到的那种问题。

    有可能让它在您的代码中仅以视觉泄漏检测器的方式工作,但它错过了有趣的案例。

    然而,最近我注意到在 Wine wiki 上他们有一个 page listing a couple of alternatives to valgrind。我从中尝试了Dr.Memory,它基本上等同于 valgrind memcheck 工具,并且在 Windows 上就像魅力一样工作。

    此外,使用工具实际上要简单得多,因为您只需构建正常的调试版本并在工具下运行它。试图覆盖分配的泄漏检测器非常复杂。

    【讨论】:

    • 谢谢我过去也使用过 DrMemory,它是一个很好的工具,但实际上我还想在程序期间跟踪内存分配(一些内存可能会进入很晚才删除的缓存,并且它看起来像泄漏),在 Windows 上使用 mingw-w64 进行调试链接也很慢。
    • @Renaud,问题在于 Windows 对象格式并不真正支持覆盖符号,并且 Microsoft 运行时可以为所欲为——尽管对于 mingw,它不应该像只使用 C 那样糟糕Microsoft 的运行时和它自己的 C++ 运行时。在使用 GNU LibC 的目标上,这一切都是微不足道的,因为 GNU LibC 具有用于替换分配器的钩子。但 Windows 不支持。
    【解决方案2】:

    Dr Memory 很棒而且免费

    http://www.drmemory.org/

    它不需要检测代码,并且代码几乎可以保持与没有它时相同的性能。我已经多次使用它来查找和修复泄漏

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2011-08-30
      • 2012-12-07
      • 2021-03-13
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      相关资源
      最近更新 更多