调试模式下内存泄漏

问题描述 投票:0回答:8

程序在调试模式下编译而不是在发布模式下编译时是否有任何原因会泄漏?

(Debug表示调试信息,禁用编译器优化,Release表示无调试信息/全面优化)

看起来就是这样,但我不明白为什么。顺便说一句,净化在这里没有帮助

c++ visual-c++ memory-leaks
8个回答
5
投票

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

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

3
投票
_CRTDBG_DELAY_FREE_MEM_DF

标志时保留释放的内存。


也有可能你有Release中不存在的内存泄漏。

编辑:您也可以手动调用

HeapCompact(GetProcessHeap(), 0)

。我似乎记得调试堆总是增长(即,它不返回空闲块),但我在任何地方都找不到该文档。

    


3
投票

assert (new Object());

如果断言在发布模式下得到优化,可能会导致此行为


1
投票

有时程序会在一种模式下运行,而在另一种模式下崩溃。

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

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


1
投票
#define _DEBUG

或者更微妙且可能更难查明的原因造成的 - 即某些不应该被优化的东西。


使用

#define _DEBUG

编译Release,看看是否仍然发生。

    


0
投票
#ifdef _DEBUG

线可能是原因之一。

    


0
投票
Windows调试工具

附带的用户模式转储堆,也看看应用程序验证器可能会说些什么。所有这些工具都非常强大,强烈推荐。 否则,除非你有泄漏的代码,这是

#ifdef

-ed,我认为调试构建没有理由泄漏,而发布则没问题。

    


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.