0

最近、アプリケーションで次のクラッシュが発生しました。

m_players[0].erase(plr); -- CRASHES HERE

m_players[1].erase(plr);

m_players次のように宣言されています。

set<PlayerPointer> m_players[2];

Visual Studio では、「0xC0000005: アクセス違反の書き込み場所 0x0000000000000024」と表示されます。

コンパイラ: Visual Studio 2008.

逆アセンブリ: 000000014007AA3B mov rcx,qword ptr [this] (クラッシュした)

したがって、その関数での this への最初のアクセスであるため、「this」が悪いために死にかけていると思います。しかし、ローカル/自動車を見たので、これは悪いポインターではないようです。

ヒントになれば幸いです。

4

4 に答える 4

2

何かが 0 を指しています。Visual Studio を使用しているので、アプリケーションをデバッグ モードでコンパイルします。Ctrl+Alt+E と入力し、例外がスローされたときにそれらを有効にします。これは、例外ハンドラーが実行される前に問題が発生した場所を検出するのに役立ちます。その後、コールスタックを投稿できますが、問題を自分で簡単に確認して解決できると思います。plr の型に関係なく、デストラクタに何か問題があることが想像できます。

于 2009-10-05T15:59:06.437 に答える
1

Visual Studio を使用する場合は、ランタイムが同じであることを常に確認してください。それを確認しましたか?(例: マルチスレッド デバッグ DLL (/MDd))

于 2011-03-26T19:52:56.460 に答える
0

これは、m_playersがすでに削除されているか、利用できないというよりも、plrと関係があると思います。plrを取得する方法を示すことができますか、それはローカル変数ですか、それとも引数として渡されますか?ローカル変数を作成し、それを消去関数で使用して、クラッシュするかどうかを確認することをお勧めします。このようにして、クラッシュの原因を正確に特定できます。

于 2009-10-05T16:09:42.077 に答える
0

配列がグローバルであり、配列が初期化される前に問題のあるコードが実行される可能性はありますか (グローバル オブジェクトのコンストラクター内などで発生する可能性があります)。

于 2009-10-05T18:41:45.017 に答える