在Debug模式下编译时是否有任何原因导致程序泄漏?
(调试意味着调试信息,禁用编译器优化,Release意味着没有调试信息/完全优化)
这就是它似乎做的但我无法弄清楚为什么。顺便说一句净化在这里没有帮助
答案 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)
这可能是很多事情,但请记住,这可能是误报。在调试模式下,您可以指望使用至少两倍的内存。这可以使你的程序大小扩展很多次,通常一旦它上升它就不会再次下降,即使内存全部在内部释放。如果'泄漏'随着时间的推移不会变得更糟,但最终会停止它并不是真正的泄漏。