我正在寻找C ++中的内存调试策略。我用QT编写了一个应用程序。我正在使用Windows 7.使用的编译器是MinGW。 在调试模式下,我有时会收到以下调试消息: HEAP CORRUPTION DETECTED:在正常阻塞(#...)之后的0x ...
我想,会发生以下情况:使用delete释放内存块。之后,使用内存。
大多数情况下,这将毫无问题地运作。 但有时,这会导致应用程序崩溃。 我的问题是,如何调试此错误?我正在考虑更换操作员new / delete。
考虑以下new / delete运算符:
struct MemHandle
{
void* ptr;
size_t size;
}
void * operator new(std::size_t n) throw(std::bad_alloc)
{
MemHandle Mem;
void* p = malloc(n);
Mem.ptr = p;
Mem.size = n;
//TODO: Store Mem
}
void operator delete(void * p) throw()
{
MemHandle Mem = GetMemHandle(p);
memset(p, 0, Mem.size);
free(p);
}
在这种情况下,当删除后重用内存时,程序将立即崩溃。这是一个好策略,还是你有更好的选择?
答案 0 :(得分:2)
您要实现的是每次内存分配的簿记。
有可用的内存分析工具(商业和开源),它们做同样的事情。
Valgrind很棒,但在Windows上不可用。
Purify是一种在windows上工作的商业工具,如果你正在寻找一个开源的工具而不是Dr Memory
您可以浏览更多工具here
答案 1 :(得分:0)
我的经验表明,调试内存问题的最佳工具是内存清理程序(GCC和LLVM都支持它们,-fsanitize-memory)。它非常快速,易于使用,而且我一直处于valgrind什么也看不见的情况,但是消毒剂确实如此。内存消毒器将SIGABORT检测到内存问题,因此堆栈跟踪将立即在您眼前。净化器的一些缺点是堆使用量增加和构建过程略微复杂,但通常不是问题。