在调试模式内存泄漏(Memory leaks in Debug mode)

2019-10-19 07:02发布

没有任何理由的程序在调试模式下的释放编译而不是当泄漏?

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

这就是它似乎做,但我想不出为什么。 顺便说一句净化不乐于帮助在这里

Answer 1:

很多指针类型错误,包括内存泄漏,可似乎出现或调试和释放模式之间切换时消失。 一对夫妇的原因可能是:

  • 有条件的代码在一个版本或其他编译
  • 事情记忆位置走动
  • 在调试版本未初始化数据的特殊格式


Answer 2:

你是如何检测泄漏? 如果通过任务管理器的,当MSVC的调试实现将保持周围释放的内存_CRTDBG_DELAY_FREE_MEM_DF标志。

这也有可能是你有没有在版本存在内存泄漏。

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



Answer 3:

这里是另外一个,断言()的调用的副作用,这可能会导致更大的问题

assert (new Object());

可能会导致此行为,如果断言被在释放模式优化了



Answer 4:

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

在有些情况下是在一种模式下运行程序,并在另外一个崩溃的情况。

这可能会导致这样的东西就是内存损坏(尤其是堆栈损坏)。 这可能就是为什么有差异的原因。 另一个原因可能是调试器犯规免费的一切,但我对此表示怀疑。

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



Answer 5:

你想尝试隔离的第一件事就是泄露是否是由于#define _DEBUG或一些更微妙的和潜在的难以精确定位-即东西越来越优化的不应该是。

与编译版本#define _DEBUG ,看看它是否仍然发生。



Answer 6:

有条件#ifdef _DEBUG线可能是原因之一。



Answer 7:

给一个尝试用户模式转储堆附带Windows调试工具 ,也看看有什么应用程序验证可能不得不说。 所有这些工具都非常强大,强烈推荐。

否则,除非你已经泄露的代码,它#ifdef -ed,我看不出有任何理由调试版本泄露,同时发行的罚款。



Answer 8:

这可能是很多事情,但请记住,它可能是假阳性。 在调试模式下,你可以指望至少使用内存的两倍。 这可以使你的程序规模扩大很多倍,通常一旦上涨就不会再次下井,即使存储所有被内部释放。 如果“泄漏”不会随着时间的推移恶化,但最终停止它不是一个真正的泄漏。



文章来源: Memory leaks in Debug mode