我在這個問題上工作了兩天,這讓我很生氣,因爲我對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