在我们的应用程序中,我们使用的是一个使用大量Qt容器的类。如果在将Visual Studio调试器附加到进程时销毁该类的对象,则释放内存极其缓慢(多分钟)。它仍然很好但很慢。
前段时间我已经确认调试器的内存检查对此是可靠的。这是一个众所周知的问题。
我解决了这个问题,只需通过调试器停止应用程序,如果它停留在释放内存中或者在没有连接调试器的情况下启动它。
但是现在我需要调试定期释放这些对象的代码。当然它可以工作但是速度慢得令人无法接受,因为我需要做很多周期,所以我需要一个更好的解决方案。
有没有办法在VS2013调试器中禁用堆内存检查?或者有没有办法从这些检查中排除一些变量?
答案 0 :(得分:2)
_CrtSetDbgFlag
控制调试堆的检查类型。
您的代码(或者您正在使用的库)可能会提高检查级别。例如,您可以在每次分配和释放时检查堆的完整性。这可能会导致巨大的放缓。不要使用_CRTDBG_CHECK_ALWAYS_DF
,除非您确实需要它来查找特定的内存问题。
对于基本的泄漏检查,通常不会造成巨大的性能损失,您只需要(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF)
。
答案 1 :(得分:2)
我尝试了另一种解决方案。将环境变量_NO_DEBUG_HEAP设置为1实际上解决了我的问题。
这可以在系统级别(使用通用环境变量编辑器,例如REE)或在应用程序级别上通过将Visual Studio项目属性Debugging / Environment设置为“_NO_DEBUG_HEAP = 1”来完成。
我在回答我的问题时发现这些信息,不幸的是不再可见(我想它已被版主删除)。它包含this链接,实际上非常有帮助。