我正在开发的软件是一个插件 DLL,在正常执行期间一切正常,并且符合预期,但是当主机卸载模块时,内存释放很慢(通过“delete []”释放了几个对象数组。如果我采取去掉所有的“delete []”指令,模块卸载变得更快)。这仅在调试版本中发生,发布版本立即卸载。我还注意到,如果我在其中一个析构函数中放置断点,调试也会很慢(每条指令平均需要 2 秒)。关于为什么会发生这种情况的任何想法?
2 回答
不确定你的情况。我已经看到与 MS IDE 和 Debug 构建和报告内存泄漏类似的东西。如果由于某种原因很多对象确实泄漏了,那么将它们报告到输出窗口会花费大量时间。
我将启用我的通灵调试帽并假设您使用的是 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 上的一致性,这会使它们变慢几个数量级。
知道哪个是真正的问题的唯一方法是分析。