调试模式下的内存泄漏

时间:2010-01-28 22:17:37

标签: c++ visual-c++ compiler-construction memory-leaks

在Debug模式下编译时是否有任何原因导致程序泄漏?

(调试意味着调试信息,禁用编译器优化,Release意味着没有调试信息/完全优化)

这就是它似乎做的但我无法弄清楚为什么。顺便说一句净化在这里没有帮助

8 个答案:

答案 0 :(得分:4)

在调试和释放模式之间切换时,许多指针类型错误(包括内存泄漏)可能似乎出现或消失。有几个原因可能是:

  • 在一个版本或另一个版本中编译的条件代码
  • 事物的记忆位置四处移动
  • 调试版本中未初始化数据的特殊格式

答案 1 :(得分:3)

你是如何发现泄漏的?如果是通过任务管理器,那么当设置_CRTDBG_DELAY_FREE_MEM_DF标志时,MSVC调试实现将保持释放内存。

您可能还有Release中不存在的内存泄漏。

编辑:您也可以手动拨打HeapCompact(GetProcessHeap(), 0)。我似乎记得调试堆总是增长(即,它不返回空闲块),但我无法在任何地方找到该文档。

答案 2 :(得分:3)

这是另一个,带有sideeffects的assert()调用,这可能会导致更大的问题

assert (new Object());
如果assert在发布模式下被优化,

可能会导致此行为

答案 3 :(得分:1)

调试和发布模式使用不同的内存模型。

有些情况下程序在一种模式下运行而在另一种模式下崩溃。

可能导致此问题的是内存损坏(尤其是堆栈损坏)。这可能是存在差异的原因。另一个原因可能是调试器没有释放所有内容,但我对此表示怀疑。

顺便说一句,您使用的是VS 2010 beta吗?这也可能是测试版中的一个错误。

答案 4 :(得分:1)

您想要尝试隔离的第一件事是泄漏是由于#define _DEBUG还是更微妙并且可能更难确定的东西 - 即一些不应该被优化的东西。

使用#define _DEBUG编译版本,看看它是否仍然存在。

答案 5 :(得分:0)

条件#ifdef _DEBUG行可能是一个原因。

答案 6 :(得分:0)

尝试User Mode Dump Heap附带的Debugging Tools for Windows,同时查看Application Verifier可能要说的内容。所有这些工具都非常强大,强烈推荐。

否则,除非你有泄漏的代码#ifdef,否则我认为没有理由让Debug构建泄漏,而Release很好。

答案 7 :(得分:0)

这可能是很多事情,但请记住,这可能是误报。在调试模式下,您可以指望使用至少两倍的内存。这可以使你的程序大小扩展很多次,通常一旦它上升它就不会再次下降,即使内存全部在内部释放。如果'泄漏'随着时间的推移不会变得更糟,但最终会停止它并不是真正的泄漏。