我想通过重载新建/删除来跟踪内存以检查泄漏和检查内存消耗(查看等)。
但是,我注意到有时一个 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 上他们有一个 page listing a couple of alternatives to valgrind .我从中尝试过 Dr.Memory它基本上等同于 valgrind memcheck 工具,并且在 Windows 上像 charm 一样工作。
另外,使用工具其实也简单多了,因为你只需要构建正常的调试构建,然后在工具下运行即可。众所周知,试图覆盖分配的泄漏检测器非常复杂。
关于c++ - 如何重载 operator new 和 delete 来跟踪内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39726235/