如何重载操作符new和delete来跟踪内存

How to overload operator new and delete to track memory?

本文关键字:delete 跟踪 内存 new 操作符 何重载 重载      更新时间:2023-10-16

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

然而,我注意到有时一个delete被调用,而没有相应的new(即使在使用boost的几行代码的简单程序中),看起来可以从另一种方式(malloc ?)获得内存,并且删除之后很高兴释放它。这给我带来了问题,因为我需要用分配来存储信息(大小)。

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

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不可用"),这也将允许我几乎正常运行程序。

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

让它在你的代码中只以视觉泄漏检测器的方式工作是可能的,但这样它就错过了有趣的情况。

然而,最近我注意到在Wine wiki上他们有一个页面列出了几个valgrind的替代品。我尝试了Dr.Memory,它基本上相当于valgrind memcheck工具,在Windows上工作起来很有魅力。

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

Dr Memory是优秀的和免费的

http://www.drmemory.org/

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