0

我在这个问题上工作了两天,这让我很生气,因为我对 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 库的深处,如下图所示:

错误发生在 boost lib 中,而不是我的代码中

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

4、这个错误只出现在Debug版,Release版没有。

5.我用在调试模式下正常工作的旧但无故障版本替换了整个解决方案。然而,在我生成此解决方案的发布版本后,调试模式出现错误!

更新:

6.谢谢各位!我刚刚尝试了一些东西,发现即使在DLL条目的第一行简单地定义一个正则表达式对象也会导致这个错误!有任何想法吗?

7.然而在这个dll的调用者的main()的第一行初始化一个正则表达式对象不会引起这个问题。

希望这个描述能帮助你回忆一些东西并给我一些提示。

我想问一下:

缩小范围和发现问题的通常策略是什么?谢谢你!

4

2 回答 2

3

查看您的代码,您可能想要验证您的m_position值是否有效......我escape_type_class_jump在您的代码中看到了一个标签,所以goto您使用的或任何机制跳转到该标签(我无法从屏幕截图)可能会绕过正在执行的任何检查以验证您的位置增量仍然有效。

于 2012-02-15T18:19:16.230 回答
1

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

于 2012-02-15T18:20:08.413 回答