如何诊断Windows上的堆损坏错误?

我正在使用Visual Studio 2013 Ultimate的Windows 8.1 64位。 我将一个程序从Linux移植到使用C ++,OpenGL和SDL的Windows。 我有适当的库自定义编译通过Cmake在Windows上的64位。 当我从Visual Studio运行程序时,IDE说有一个头损坏。 这并不奇怪,因为我使用指针来实例化对象,而且我正在使用原始指针,我打算为了参数而改变为智能指针。 以后我会做魔术。

与此同时,我用我的Linux计算机通过Valgrind诊断任何内存泄漏,Valgrind没有任何严重的报告。 然后我开始使用CppCheck,但是那里也没有任何严重的问题。 也许我在这里太宽松了,Windows可能实际上正在采取比Linux更严肃的东西,这是一个惊喜,因为MSVC比GCC更容易宽容。

所以,这个程序在Linux上工作,而不是在Windows上。 (太棒了!)而Visual Studio并没有通过抛出exception让我讨厌Windows的地方变得更加困难。 我开始search一个解决scheme,碰到这个叫做gflags或页面助手的东西,所以我安装了debugging工具,试图启动gflags,但我不知道如何使用它! 我后来发现,你必须使用一些其他的工具称为adp,然后附加gflags,所以当我启动adp它崩溃。 所以现在我不知道该做什么,并且正在放弃这个端口(这很有趣,因为很多人抱怨把程序从Windows移植到Linux是相当困难的,而事实恰恰相反)。

所以,现在我呼吁这个社区的帮助:我如何debugging/诊断Windows上发生的堆损坏错误,但不是在Linux上? 我真的应该使用gflags,还是应该用我的胆量呢?

Solutions Collecting From Web of "如何诊断Windows上的堆损坏错误?"

使用调试堆,并在main()的最开始处调用它。

_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);

这会使计划变慢,但一旦发生腐败,计划就会中断。

有关详细信息,请参阅此文章: https : //msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks

@卡洛斯的解决方案是完美的小问题。 但对于巨大的问题,由此产生的减速有时候是不能忍受的。

在这种情况下,可以放置

 ASSERT(_CrtCheckMemory()); 

在代码的某个地方,人们怀疑问题已经存在。 该命令在(并且仅在)它所插入的位置检查堆,而不是在每次newdelete调用之后检查堆,如_CRTDBG_CHECK_ALWAYS_DF的情况。 与_CRTDBG_CHECK_ALWAYS_DF选项相比,这保持了合理的执行时间。

人们可以通过使用二进制搜索类型的方法很快找到有问题的代码行来放置断言。