0

未処理の例外をスローしている Win32 コンソール アプリケーションをリバース エンジニアリングして修正しようとしています。

スレッドで実行されているクラスのインスタンスが 32 個あります。これらの「サービス」スレッドはそれぞれ CMessage の一意のインスタンスを定期的に作成/削除する必要があり、これらの CMessage オブジェクトはそれぞれ Service クラスでプライベートに宣言されます。

デバッガーでアプリケーションを実行すると (Visual Studio 2005 を使用しています)、CMessage のウォッチ ウィンドウは、CMessage メンバー関数が呼び出される直前に、CMessage のアドレスが 0x00000000 に変更されることを示します - 例外の原因です。

なぜこれが起こるのかについて私が見ることができる簡単な説明はありません。前のコード行とこの行の間で不都合なことは何も起こっていないように見えるので、私の疑いでは、何らかの理由で各スレッドが他のスレッドの 1 つから CMessage オブジェクトを誤って参照している可能性があります (スレッドの有効期間中のある時点で CMessage がそのスレッドのオブジェクトは削除されます)。

私の質問は次のとおりです。これらの CMessage オブジェクトが完全にスレッドセーフであり、現在のクラス スコープを除いて、どこからでも変更/削除できないことを確認する最善の方法は何ですか? これがプライベートの目的だと思っていましたが、今は完全にはわかりません。私がやろうと思ったことの 1 つは、次のように CMessage オブジェクトを参照することでした。

this->myCMessage;

ただとは対照的に:

myCMessage;

これで違いはありますか?

4

1 に答える 1

0

クラスのプライベート タグは単なる構文糖衣であり、コードの生成方法は変わりません。

メンバー関数を呼び出した直後にクラス メンバーが NULL になった場合、メンバー関数が何らかの方法で CMessage オブジェクトを削除することが問題である可能性があります。ただし、CMessage オブジェクトがスタックに割り当てられている場合、問題はおそらくそうではないことに注意してください。

もう 1 つの問題は、CMessage オブジェクトにアクセスしている現在の関数が完了する前に、CService オブジェクトが破棄される (スレッドが終了する) ことです。

于 2012-05-18T10:46:12.727 に答える