2012-01-10 10 views
3

を挿入します。原因::セット::私は以下の'addToOurSet`方法で私たちのプログラムがクラッシュ(セグメンテーション違反)の問題をデバッグしようとしています

class SomeClass { 
    // (...) 
    void addToOurSet(SomeOtherClass* obj) { ourSet.insert(obj); } 
    std::set<SomeOtherClass*> ourSet; 
}; 

クラッシュが原因再現するのは難しいです(複雑さと複雑なデータサイズ、デバッグビルドでの再現性の問題など)、上記の例は明らかに非常に単純化されています。トレースバックは、クラッシュが発生して示しています

std::_Rb_tree<...>::insert_unique(SomeOtherClass* const&) 

私の質問は:ourSet.insert(...)方法がクラッシュする可能性がありますか?私が理解する限り、それはポインターであるため、挿入されたオブジェクト自体には何も起こりません。正しい?だからセットそのものの問題を見ていますか?明らかに、何らかの理由でsetポインタが無効な場合、コールはクラッシュする可能性がありますが、たとえば、セットの一部の操作が、このように無効になる可能性があります(たとえば、その末尾を削除したり、

+2

根本的な原因は、 'insert'メソッドで表示されているyoruプログラムの別の場所でメモリが破損している可能性が高いためです。 valgrindまたは同様のツールの下でプログラムを実行しようとしましたか?うまくいけば、 – JaredPar

+0

スタックスマッシュの可能性が指摘されます。 –

+0

私もメモリ破損の疑いがありますが、私自身は(SomeClassインスタンスの削除など)セット自体の無効化に焦点を当てるべきかどうか、あるいはセットの無効な操作でこれが発生する可能性があるかどうかについて質問します。 – Krumelur

答えて

3

は、いくつかの可能性がある:

  1. 自体が無効であるset(封入SomeClassインスタンスが削除された、または等ダングリングポインタを介してアクセスされています)。
  2. どこかでメモリの破損があります。

私はおそらくvalgrindまたは類似のツールで開始します。

+0

あなたのポイントは非常に有効ですが、残念ながらプログラムの複雑さのためにvalgrindを実行することはできません(私はすでに試して失敗しました...)。 – Krumelur

+0

@Krumelur:(a)それは意味をなさない(b)なぜあなたはあなたのプログラムのすっきりしたバージョンでデバッグしていませんか? (c)これは**答えです**。がんばろう。 –

+0

@LightnessRacesinOrbitもっと同意できませんでした。私はちょうど検索を少し絞ることを望んでいた。 – Krumelur

関連する問題