2011-12-18 12 views
6

私が取り組んでいるC++プロジェクトは、最初の例外をスローすると終了します。これは、最初にVisual Studio 2008でデバッグモードで、単一のキーと値のペアを含むmap<pair<int,int>, int>にアクセスするときに発生します。コードには論理的に間違ったものはありません。C++:未知のポイントで発生した最初の例外をどのように解決できますか?

私は最初の例外を読んで、問題が必ずしも問題になるとは限りません。それにもかかわらず、私はそのような例外をすべて打ち破ろうとしましたが、予想通り、いくつかの問題が発生しています。

私が取り組んでいるクラスは非常に大きく、多くのカスタムメモリ割り当てが含まれています。どういうわけか、これらの問題の1つが問題を引き起こしていると私は推測しています。しかし、私は何がうまくいかないのかを特定する方法を見つけるために数時間を費やしてきました。

最初の例外出力は以下のとおりです。それはあまり役に立ちません!

First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00. 
First-chance exception at 0x0050ae33 in theapp.exe: 0xC0000005: Access violation reading location 0x00000010. 
Unhandled exception at 0x0050ae33 in theapp.exe: 0xC0000005: Access violation reading location 0x00000010. 

私はこの時点で本当に苦労しており、どのように進めるべきかわかりません。

どのように私はこの問題に取り組み、何がうまくいかないのかを誰にでも示唆できますか?私はあなたの助言に非常に感謝しています。

UPDATE

ここでは、関連するコードです。ネストされたに記載されている最初のcoutのステートメントにデバッガブレークFOR:

 // Inside operator() : 

     map<pair<int,int>,int> resultIdByStructIds; 
     pair<int,int> spair (-1,-1); // Structure pair ids reusable reference. 

     int nextMapEntryId = 0; 
     int nextNumCandidates = 0; 
     // For each remaining candidate. 
     for (int ci = 0; ci < numCandidates;) { 
      // If candidate has been mapped or found not viable this mapping round, 
      // move past it. 
      if (candidatesDoneThisRound[ci] == currentMappingRoundId) { 
       ++ci; 
       continue; 
      } 

      Candidate candidate = candidates[ci]; 
      const int tId = candidate.tVertexId; 
      const int pId = candidate.pVertexId; 

      // Grab the result for this structure pair. 
      // Create it if it doesn't exist. 
      // Avoid copying as slight optimisation; simply 
      // store pointer to true result instead. 
      spair.first = tInfos[tId].structure->id; 
      spair.second = pInfos[pId].structure->id; 

      // DEBUG 
      cout << "resultIdByStructIds size: " << resultIdByStructIds.size() << endl; 
      for (map<pair<int,int>,int>::const_iterator ids_id = resultIdByStructIds.begin(); ids_id != resultIdByStructIds.end(); ++ids_id) { 
       cout << ids_id->first.first << endl; // * Debugger breaks here. 
       cout << ids_id->first.second << endl; 
       cout << ids_id->second << endl; 
       printf("Structures(%i,%i) => %i\n",ids_id->first.first,ids_id->first.second,ids_id->second); 
      } 
      // 

      // code continues... 

UPDATE 2

ここで問題になっているマップのマウスオーバー記述のイメージです。それはマイケルバーが提案したように壊れているように見える。一般的に

enter image description here

+2

これは、終了する最初の例外ではありませんが、未処理の例外です。 –

+1

私はMSVSを知らないが、何とか "アクセス違反"があると、 "コードに何も問題がない"と疑う。 –

+0

あなたは "コードに論理的に何も問題はない"と言う。これまでのすべての兆候は、コードに何か問題があることです。私たちにコードの行を示してください(関連する先行する行とともに)。 –

答えて

9

、アプリがクラッシュするコードのスポットを特定するには、デバッグ/例外の下で例外処理をオンにすることができます。この場合、最後のブランチを展開し、アクセス違反をチェックします。もちろん、悪いもの(0x10にアクセスする)だけでなく、すべてのアクセス違反で停止します。最後の既知の瞬間にトラップをオンにすることで、これを最小限に抑えることができます。

通常、メモリ使用エラーが発生します。このタイプのエラーの原因を特定する最も簡単な方法は、BoundCheckerのようなサードパーティのツールで、メモリを破壊するとすぐに叫ぶでしょう。レイモンド・チェンのアドバイスが欠けている。どんなオブジェクトが間違っているのかを解明し、ウォッチウィンドウを使ってそれがいつ変化したかを見てください。または、データブレークポイント機能を使用すると、特定のアドレスのデータが変更されたときにプログラムを停止させることができます。

+0

この情報をありがとう、アラン。あなたの答えに目を覚ますのにずっと時間を掛けてしまったことに対する私の謝罪 – KomodoDave

関連する問題