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

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

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

但是,我注意到有时一个 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/

相关文章:

c++ - 在 Windows 上将 Boost 库与 Boost_USE_STATIC_LIB OFF 链接

c++ - g++4.4 : iostream move semantics

C++11 - move 语义在构造上很慢

c++ - 传递给模板函数时,lambda 自动衰减为函数指针

c++ - 理解 c++11 右值、 move 语义和性能

python - SWIG 和 Boost::变体

c++ - 如何在 VS C++ 上初始化 boost::edge_weight_t 类型

c++ - 即使库已链接,CMake 可执行链接器错误

c# - 应用程序在非开发系统上崩溃

c++ - 托管 C++ std::string 在非托管 C++ 中不可访问