调试版本中C ++“删除”速度慢

时间:2012-08-29 17:31:54

标签: c++ debugging delete-operator

我正在处理的软件是一个插件DLL,一切正常并且在正常执行期间正如预期的那样,但是当主机卸载模块时,内存释放很慢(几个对象数组通过“delete []”解除分配。如果我拿走所有“delete []”指令,模块卸载变得更快)。这只是在调试版本中发生,版本构建立即卸载。我还注意到,如果我在其中一个析构函数中放置一个断点,调试也很慢(每条指令平均需要2个秒)。关于为什么会发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:1)

不确定你的情况。我见过类似于MS IDE和Debug构建并报告内存泄漏的东西。如果由于某种原因很多对象确实泄漏,那么将它们报告到Output窗口会花费相当多的时间。

答案 1 :(得分:0)

我将启用我的通灵调试帽并假设您正在使用VC ++。这是一个至关重要的信息,因为它没有提供,我不得不猜测。

接下来,您说“每条指令平均需要2秒”。如果通过“指令”表示汇编语言指令,则这是调试器运行缓慢的单独问题。有多种原因,例如设置了太多断点(https://randomascii.wordpress.com/2011/07/02/xperf-and-visual-studio-the-case-of-the-breakpoint-hangs/),在源集中显示线程(https://randomascii.wordpress.com/2013/03/03/visual-studio-single-step-performance-fixes/)或其他可能的原因。但这是一个调试器问题,而不是调试构建问题。

在调试器下运行时,Windows堆运行速度较慢 - 它会执行其他检查。这可能是问题,但请注意,这与您是否正在运行调试版本无关。

CRT堆在调试版本中运行速度较慢,并且在每次分配和获取时都获取锁定,从而序列化分配。并且,如果设置了_CRTDBG_CHECK_ALWAYS_DF,那么将检查整个堆的每个alloc和free的一致性,这可能会使它们的数量级变慢。

了解真正问题的唯一方法是分析。