0

私はこの問題に 2 日間取り組んでいますが、私はまだ C++ に慣れていないので気が狂いそうです。この違反アクセスの問題は、あなたにとって非常に簡単で、何千回も回答される可能性があります。しかし、C++ の知識が不足しているため、これまでに回答された同じ問題を特定することさえできません。

ここに私の問題があります:

1.主要なコードは DLL にあります。Visual Studio 2008 を使用しています

2.この DLL は、boost、tinyXML、および SRILM (NLP ツールキット) の 3 つの外部ライブラリを呼び出しました。

3.エラーは次のとおりです: Unhandled exception at 0x5f4f068f (TextNormalizerAPI.dll) in tester.exe: 0xC0000005: Access violation reading location 0x00000000.、デバッグ モードでのみ発生しました。また、エラー行はpatUsername = regex("^\\W*@[A-Za-z]");コード内の boost::regex オブジェクト ( ) の初期化によって発生しましたが、実際の位置は下の図に示すように、boost ライブラリの奥深くにありました。

私のコードではなく、ブーストライブラリでエラーが発生しました

**ほとんどの場合、Boost lib のソース コードを変更することは想定されていませんね。**

4.このエラーは、リリース バージョンではなく、デバッグ バージョンでのみ発生しました。

5.ソリューション全体を、デバッグ モードで正常に動作する古いが障害のないバージョンに置き換えます。しかし、このソリューションのリリース バージョンを生成した直後に、デバッグ モードでエラーが発生しました。

アップデート:

6.ありがとうございます!何かを試してみたところ、DLL のエントリの最初の行で正規表現オブジェクトを単純に定義しても、このエラーが発生することがわかりました。何か案は?

7.この dll の呼び出し元の main() の最初の行で正規表現オブジェクトを初期化しても、この問題は発生しません。

この説明が何かを思い出し、ヒントを与えるのに役立つことを願っています。

私は尋ねたい:

問題を絞り込んで特定するための通常の戦略は何ですか? ありがとう!

4

2 に答える 2

3

コードを見て、値が有効であることを確認することをお勧めしますm_position...escape_type_class_jumpコードにラベルが表示されているので、gotoそのラベルにジャンプするために使用しているメカニズム、またはそのラベルにジャンプするために使用しているメカニズム(スクリーンショット)は、位置の増分がまだ有効であることを確認するために行われているチェックをバイパスしている可能性があります。

于 2012-02-15T18:19:16.230 に答える
1

「これ」(つまり、basic_regex_parser)が NULL のように見え、NULL オブジェクトでメソッドを呼び出そうとしていますが、明らかにうまく機能していません。「これ」が実際に NULL の場合 (「ローカル」タブを見ればわかります)、コール スタックを「basic_regex_implementation」レベルまで上げて、そこで何が起こっているかを確認します。この NULL 値はどこから来ているのでしょうか?一般に、コール スタックのさまざまなレベルと、それらのレベルの変数の値を調べると役立ちます。

于 2012-02-15T18:20:08.413 に答える