2014-07-22 27 views
1

在我们的应用程序中,我们使用的是一个使用大量大Qt容器的类。如果在Visual Studio调试器连接到进程时该类的对象被销毁,释放内存极其缓慢(多分钟)。它仍然工作正常,但非常缓慢。使用可视化调试器释放内存很慢

前一段时间我已经可以确认调试器的内存检查是否有责任。这是一个已知的问题。

我解决了这个问题,只需通过调试程序停止应用程序,如果它停留在释放内存或通过没有附加调试器启动它。

但是现在我需要调试定期释放这些对象的代码。当然,它可以工作,但速度慢,因为我需要做很多周期,所以我需要更好的解决方案。

有什么办法可以禁用VS2013调试器中的堆内存检查吗?或者有没有办法从这些检查中排除一些变量?

+1

即使你已经确认MSVC的内存检查是导致这种速度下降的原因,我还是会看看你自己的代码,看看是否有效率低下(比如不必要的对象创建/删除?) – YePhIcK

+0

这就是我检查的第一件事。不幸的是,我无法以不会触发问题的方式更改代码。 – Silicomancer

回答

2

我试过另一种解决方案。将环境变量_NO_DEBUG_HEAP设置为1实际上解决了我的问题。

这可以通过将Visual Studio项目属性Debugging/Environment设置为“_NO_DEBUG_HEAP = 1”在系统级别上完成(使用通用环境变量编辑器,例如REE)或在应用程序级别完成。

我发现这个信息在我的问题的答案,不幸不再可见(我想它已被版主删除)。它包含this链接,这实际上非常有帮助。

2

_CrtSetDbgFlag控制调试堆做什么类型的检查。

您的代码(或者您正在使用的库)可能会提高检查级别。例如,您可以让它在每次分配和释放时检查堆的完整性。这可能导致巨大的放缓。除非您真的需要它来查找特定的内存问题,否则请勿使用_CRTDBG_CHECK_ALWAYS_DF

对于基本的泄漏检查,这通常不是一个巨大的性能损失,您只需要(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF)

+0

我试着调用_CrtSetDbgFlag(0);进行测试但行为没有改变。 – Silicomancer