2012-01-24 26 views
0

私はデバッグをして少し壁に当たった。私は2つのアクセス違反のエラーが私のプログラムの完全に無関係な部分で、どちらも私は本当に理解している。私はこのケースでは、新しい変数を宣言するとき、私は、私はそれが関連するだろうかわからない名前は、コードのどこにも使用されていないことを確認している変数を宣言するとアクセス違反が発生する

std::map<float, float> fMap; 

そのうちの一つは、発生したが、それはすべてです私は考えることができます。私はポインターで何かばかげたことをしたとき、私はこれまでに一つしか作れなかったと思う。これを引き起こしている可能性のあるアイデアは誰にもありますか?プロジェクトは、ボーランドで6

おかげで、コンパイルされている

+1

コードをコンパイルするときまたはコードを実行するときにアクセス違反が発生していますか? – MerickOWA

+4

宣言はアクセス違反とは関係ありません。この現象を再現して質問に投稿できる小さなプログラムを作成します。 – Mahesh

+0

問題はそのコードにありません。 –

答えて

2

エラーが手元の宣言とは何の関係もありません:ほとんどの場合、それはあなたが以前に作られたエラーの遅れた結果です。マップ宣言を打つ前に実行されたコードの中には、ある意味でヒープが破損しているものがあります。 潜在的に「遅延」クラッシュにつながる可能性があるという事は、に割り当てられたメモリ領域外への書き込みは、メモリ数回

  • を解放
  • あなたに割り当てられていないメモリを解放

    • ですあなた

    これらのエラーはすぐにクラッシュする可能性がありますが、しばしば致命的なヒープ構造の一部が破損してクラッシュを引き起こすのを待っています。 std::mapが内部にメモリを割り当てると、破損したヒープからメモリを要求してクラッシュをトリガします。

    メモリプロファイリングツールを使用することをお勧めします。エラーが発生したときにそのエラーを特定し、その結果を追跡するのではなく、問題に対処する必要があります。

  • +0

    私が地図をコメントアウトすると(結果的に他のものも)、メソッドは他のいくつかのstlオブジェクトの作成を含めて問題なく実行されます。これは、他の一見非官能的なアクセス違反を説明するかもしれないと言いました。 – Bowler

    +0

    @Bowlerクラッシュを表示するかどうかは、割り当てのサイズと割り当てられる項目の数によって異なります。そのため、クラッシュのタイミングは、特に並行環境では、やや恣意的です。メモリプロファイラを使用すると、すべてをクリアする必要があります。 – dasblinkenlight

    +0

    スポットがあります。私がオブジェクトを理解していない理由で、new'dが問題を引き起こしているように見えました。とにかくそれを最初の場所でポインタにすることはおそらく間違った選択でした。 – Bowler

    0

    std :: mapsのキーとして浮動小数点を使用しないでください。比較演算子は浮動小数点ではうまく動作しません。あなたは私に他のエラーのいくつかの詳細を教えてもらえますか?

    +0

    「フロートをキーとして使用しないでください...」は過大化されている可能性があります。 SOに関する多くの他の関連する質問を参照してください。しかし、それは確かに疑問点に有効なポイントです。浮動小数点をキーとして使用することはめったに正しいことではありません。あなたが実際にキーとして浮動小数点を必要とするときは、通常、カスタムの比較関数や呼び出しコードの他の特殊な機能が必要です。オリジナルの「アクセス違反」の質問をするOPは、これらの特別なケースの1つに対処していない可能性が最も高いです。 –

    +1

    いつですか? 'float'の' <'演算子は、必要な順序関係を定義します(少なくとも、NaNがない限り)。 'float'をキーとして使用するのは適切ではないかもしれませんが(浮動小数点の出所によって異なりますが)、未定義の動作もクラッシュすることもありません。 –

    0

    これは確かに未定義の動作であるあなたが をした以前のエラー—何か、無効 ポインタまたは参照、またはポインタを悪用して行うには、おそらく何かの結果です。最も頻繁に発生するのは、割り付けられたブロックの末尾を越えて書き込むか、ダングリングポインタ(メモリがすでに削除されている)を使用して を書き込むことです。これは、多くの場合、例えば、 非常に非表示にすることができます:コンテナから要素を追加または削除

    std::vector<int> v; 
    v.push_back(1); 
    int& r = v[0]; 
    v.push_back(2); 
    r = 0; 
    

    は、(容器の種類によって異なります)は、特定の状況下で の要素へのすべての の参照やポインタを無効にすることができますコンテナ。

    Cの時代、最も一般的な原因の1つは、 strlenバイトを割り当ててから、strcpyとすることでした。最新のC++を使用している場合、 は、おそらくポインタを無効にするコンテナへの挿入、 参照、またはまだ使用されているイテレータである可能性があります。ライブラリのデバッグ バージョンを使用すると、イテレータの問題を捕捉できます。 valgrindのようなツール は、通常、ポインタと 参照の問題をキャッチします。両方とも使用する必要があります(良いテストの場合は、 スイート—のいずれも、テストで発生していないエラーをキャッチしません。 ケース)。

    関連する問題