内存调试策略

时间:2016-01-30 19:14:51

标签: c++ qt memory heap-corruption

我正在寻找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);
}

在这种情况下,当删除后重用内存时,程序将立即崩溃。这是一个好策略,还是你有更好的选择?

2 个答案:

答案 0 :(得分:2)

您要实现的是每次内存分配的簿记。 有可用的内存分析工具(商业和开源),它们做同样的事情。
Valgrind很棒,但在Windows上不可用。
Purify是一种在windows上工作的商业工具,如果你正在寻找一个开源的工具而不是Dr Memory
您可以浏览更多工具here

答案 1 :(得分:0)

我的经验表明,调试内存问题的最佳工具是内存清理程序(GCC和LLVM都支持它们,-fsanitize-memory)。它非常快速,易于使用,而且我一直处于valgrind什么也看不见的情况,但是消毒剂确实如此。内存消毒器将SIGABORT检测到内存问题,因此堆栈跟踪将立即在您眼前。净化器的一些缺点是堆使用量增加和构建过程略微复杂,但通常不是问题。