我有一个项目,在'main'函数完成后,它会连续导致两次断言失败。这是非常有问题的,因为它没有向我显示导致问题的代码段。
我在一定程度上缩小了问题的范围。带有空的主功能:
int main(int argc,char* argv[])
{
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
return main(__argc,__argv);
}
一切都很好。然而,一旦我使用了特定dll中的任何类或函数(这是项目的一部分),问题就开始出现:
int main(int argc,char* argv[])
{
Color col(255,0,0,255);
col.r += 1;
int r = HeapValidate(GetProcessHeap(),0,nullptr);
std::cout<<r<<std::endl;
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
return main(__argc,__argv);
}
"Color"类是该dll的一部分,但它不是问题的原因"HeapValidate"返回1,这意味着根据文档,堆是有效的。
有问题的dll包含数十万行代码,这使得调试更加困难。
在一个类似的问题上,我找到了使用WinDBG的建议,但我不确定该如何处理结果:
http://pastebin.com/zV27b51Z
它证实了这个问题是某种内存损坏,但我仍然不知道它是从哪里来的。
有什么方法可以可靠地找到起源吗?还是我一直在使用试错法?
我的操作系统是Windows 8.1,我使用的是Visual Studio 2013。
在调试器下运行应用程序,然后在断言消息框中按"重试"按钮。将调用DebugBreak,调试器将获取coltrol。