在调试模式下访问冲突,但在发布模式下很好

时间:2012-02-15 18:13:35

标签: c++ boost access-violation release-mode

我正在解决这个问题两天,这让我很生气,因为我对C ++还很陌生。这种违规访问问题对您来说可能非常容易,并且可能会被回答数千次。但是我缺乏C ++知识使我甚至无法识别出有同样问题的答案。

好的,这是我的问题:

1。主要代码在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库中,如下图所示:

The error occurred in boost lib, not in my code

**在大多数情况下,我不应该更改Boost lib的源代码,不是吗? **

4. 此错误仅发生在调试版本中,而不是发布版本中。

5. 我将整个解决方案替换为旧的但没有故障的版本,该版本在调试模式下正常工作。然而,在我生成此解决方案的Release版本之后,调试模式发生了错误!

更新

6。谢谢你们!我只是尝试了一些东西,发现即使在DLL的条目的第一行中简单定义一个正则表达式对象也会引发这个错误!有任何想法吗?

7。但是在此dll调用者的main()的第一行初始化一个正则表达式对象不会引发此问题。

希望这个描述可以帮助你回忆一些事情并给我一些提示。

我想问:

缩小并发现问题的通常策略是什么?谢谢!

2 个答案:

答案 0 :(得分:3)

查看您的代码,您可能需要验证您的m_position值是否有效...我在您的代码中看到了escape_type_class_jump标签,因此goto或其他你用来跳转到那个标签的机制(我无法从屏幕截图中看出)可能会绕过正在进行的任何检查,以验证你的位置增量是否仍然有效。

答案 1 :(得分:1)

在我看来,“this”(即,basic_regex_parser)是NULL,并且它试图在NULL对象上调用一个方法,这显然不能正常工作。如果“this”确实为NULL(您可以通过查看“Locals”选项卡来判断,那么我会将调用堆栈调到“basic_regex_implementation”级别,看看那里发生了什么 - 这个NULL值来自何处?通常,查看调用堆栈的不同级别以及这些级别中变量的值将会有所帮助。