如何重载operator new和delete来跟踪内存?

时间:2016-09-27 13:39:44

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

我想通过重载新/删除来跟踪内存以检查泄漏并检查内存消耗(窥视等)。

但是,我注意到有时会在没有相应的新内容时调用一个删除(即使是使用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不可用),这也允许我几乎正常运行程序。

2 个答案:

答案 0 :(得分:1)

Microsoft标准库有时直接使用内部分配函数,而不是通过运算符。并不总是一贯的。几年前,我使用DUMA尝试了这一点,但是当流开始出现故障时,你就放弃了这种问题。

有可能只在视觉检漏器的方式下使用它在代码中工作,但它却错过了有趣的案例。

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

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

答案 1 :(得分:1)

记忆博士优秀且免费

http://www.drmemory.org/

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