Por*_*ous 8 c++ linux windows opengl visual-studio-2013
我在Visual Studio 2013 Ultimate中使用Windows 8.1 64位.我正在将程序从Linux移植到Windows,它使用C++,OpenGL和SDL.我在Windows上通过64位的cmake自定义编译了相应的库.当我从Visual Studio运行该程序时,IDE表示存在头部损坏.这并不奇怪,因为我正在使用指针来实例化对象,而我正在使用原始指针,我打算为了参数而改为智能指针.我稍后会做升力魔法.
与此同时,我使用我的Linux计算机通过Valgrind诊断任何内存泄漏,Valgrind没有任何严重的报告.然后我继续使用CppCheck,但那里也没有什么严重的.也许我在这里太宽容了,Windows实际上可能会采取比Linux更严重的不那么严重的事情,这是一个惊喜,因为MSVC往往比GCC更宽容.
因此,该程序适用于Linux,而不适用于Windows.(太棒了!)并且Visual Studio并没有帮助在整个地方抛出异常,这让我更加讨厌Windows.我开始谷歌搜索解决方案并遇到了这个叫做gflags或页面助手的东西,所以我安装了调试工具并试图启动gflags但我不知道如何使用它!然后我发现你必须使用一些名为adp的其他工具,然后将gflags附加到它,所以当我启动adp时它会崩溃.所以现在我不知道该做什么,并且即将中止端口(这很有趣,因为很多人都在抱怨将程序从Windows移植到Linux有多么困难,而事实恰恰相反).
所以,现在我呼吁这个社区寻求帮助:如何调试/诊断Windows上但不是Linux上发生的堆损坏错误?我真的应该使用gflags还是应该只使用我的胆量呢?
使用调试堆并在main()的最开头调用它.
_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);
它会大大减慢程序的速度,但一旦发生腐败就应该中断.
有关详细信息,请参阅此文章:https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks
@ Carlos的解决方案非常适合较小的问题.但是对于巨大的问题,由此导致的减速有时是你无法忍受的.
在这种情况下,人们可以放置
ASSERT(_CrtCheckMemory());
Run Code Online (Sandbox Code Playgroud)
代码中的某个地方,人们怀疑问题已经存在.此命令检查堆中的堆(并且仅在其处),而不是在每次调用之后new或在delete调用时检查堆_CRTDBG_CHECK_ALWAYS_DF.与选项相比,这使执行时间合理_CRTDBG_CHECK_ALWAYS_DF.
通过使用二进制搜索方法来放置断言,可以很快找到有问题的代码行.
| 归档时间: |
|
| 查看次数: |
8128 次 |
| 最近记录: |