如何重载操作符new和delete来跟踪内存
How to overload operator new and delete to track memory?
我想通过重载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/它不需要对代码进行检测,并且代码几乎与没有它时保持相同的性能。我已经多次使用它来查找和修复泄漏
相关文章:
- 运算符C++ "delete []"仅删除 2 个前值
- 光线跟踪器灯光反射错误
- 人脸跟踪arduino代码的优化
- 跟踪滚动条上的鼠标事件
- g++用户定义的动态链接库上的全局new和delete运算符
- 如何使用新运算符跟踪在循环中创建的 QLabel
- 为什么"delete"关键字不删除节点?
- C++:跟踪类对象
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- "delete"在 C++ 中实际上做了什么?
- 跟踪日志中的T.11803()是什么意思?
- 析构函数和'delete'之间的区别
- 如何知道何时调用删除以及何时调用 delete[] C++?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 析构函数中的"delete this"
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 为什么在c++中使用Delete[]会出现跟踪/断点错误
- 使用重载的 new 和 delete 运算符跟踪已用内存
- 如何重载操作符new和delete来跟踪内存