我在这个问题上工作了两天,这让我很生气,因为我对 C++ 还是很陌生。这个违规访问问题对您来说可能很容易,可能会被回答数千次。但是我对 C++ 知识的缺乏使我什至无法识别曾经回答过的相同问题。
好的,这是我的问题:
1. 主要代码在DLL中。我正在使用 Visual Studio 2008
2.这个 DLL 调用了 3 个外部库:boost、tinyXML 和 SRILM(一个 NLP 工具包)。
3. 错误显示:在 0x5f4f068f (TextNormalizerAPI.dll) in tester.exe: 0xC0000005: Access violation reading location 0x00000000.
未处理的异常,仅发生在调试中模式。错误行是由我代码中的 boost::regex 对象 (patUsername = regex("^\\W*@[A-Za-z]");
) 初始化引起的,但实际位置在boost库的深处,如下图所示:
**在大多数情况下,我不应该更改 Boost 库的源代码,不是吗? **
4.这个错误只发生在Debug版本,Release版本没有。
5. 我将整个解决方案替换为一个旧的但无故障的版本,该版本在 Debug模式下可以正常工作。然而,在我生成此解决方案的发布版本后,立即在 Debug模式下发生错误!
更新:
6. 谢谢大家!我刚刚尝试了一些东西,发现即使是在 DLL 条目的第一行简单地定义一个正则表达式对象也会导致这个错误!有任何想法吗?
7. 但是在这个dll调用者的main()函数的第一行初始化一个regex对象不会导致这个问题。
希望这个描述能帮助你记忆起一些事情并给我一些提示。
我想问:
缩小范围并发现问题的常用策略是什么?谢谢!
最佳答案
查看您的代码,您可能想要验证您的 m_position
值是否有效...我在您的代码中看到一个 escape_type_class_jump
标签,所以 goto
或您用来跳转到该标签的任何机制(我无法从屏幕截图中看出)可能会绕过正在进行的任何检查以验证您的位置增量仍然有效。
关于c++ - 在 Debug模式下访问冲突,但在 Release模式下正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9298893/