我在这个问题上工作了两天,这让我很生气,因为我对C++还很陌生。这种违规访问问题对您来说可能相当容易,可能会被解答数千次。但是我缺乏C++知识,使我甚至无法确定曾经回答过的同样的问题。这里在调试模式下访问冲突,但在发布模式下很好
确定是我的问题:
的主要代码是一个DLL。我正在使用Visual Studio 2008
2.该DLL调用3个外部库:boost,tinyXML和SRILM(NLP工具包)。
3.错误说:Unhandled exception at 0x5f4f068f (TextNormalizerAPI.dll) in tester.exe: 0xC0000005: Access violation reading location 0x00000000.
,只发生在调试模式。和错误行由我的代码中一个boost :: regex对象(patUsername = regex("^\\W*@[A-Za-z]");
)的初始化引起的,但实际位置是深深Boost库里面,如图下图:
* *在大多数情况下,我不应该更改Boost lib的源代码,不是吗? **
4.此错误仅出现在调试版本中,而不是发布版本中。
5.我用一个旧的但没有错误的版本替换了整个解决方案,该版本在调试模式下正常工作。然而,在我生成此解决方案的发布版本之后,在调试模式下发生错误!
UPDATE:
6.谢谢你们!我只是尝试了一些东西,发现即使是简单的在DLL入口的第一行定义一个正则表达式对象也会发生这个错误!有任何想法吗?
7.但是在这个DLL的调用者的main()的第一行初始化一个正则表达式对象不会引发这个问题。
希望这个描述将帮助你回忆一些事情,并给我一些提示。
我要问:
什么是缩小和发现问题的常用策略是什么?谢谢!
阅读调用堆栈(屏幕截图中的底部疼痛)通常会有所帮助。它告诉你哪个功能导致了问题。 – 2012-02-15 18:15:46
Visual Studio会在调试模式下执行某些操作,如零内存,并且可能会填充可以隐藏真正内存问题的东西。带箭头指示符的m_position的值是多少? – 2012-02-15 18:17:29
@ToddMurray谢谢!然而,问题是这个代码是boost库的一部分,我认为这个问题不应该是一些编码错误,但一些链接或打破堆栈中的返回地址等太复杂,我不能识别.. – JXITC 2012-02-15 18:20:03