2012-01-07 13 views
4

編集:解決方法、私は知っているが、私はなぜ理解していない。どのようにunordered_map原因sigsegv

私は

unordered_map<int,T> variables; 

tr1::unordered_map<int,T> variables; 

からvariables宣言を変更し、それが仕事の罰金です。

理由がわかっている場合は、回答に記入してください。

私は非常に大きなプログラムを持っているので、どのコードをここに持ってくるべきか分かりません。

派生クラスを継承する抽象クラスがあります。 要約はプライベートメンバーとしてunordered_map<int,int>(テンプレート)、パブリックメソッドinsert(int,int)を持っています。

派生クラス最初intカウンタよう使用

unordered_map<int,int>コンテナに要素を挿入するために、基本クラスをinsert方法を使用して、最初の11個のインサート要素はO.K.行く0で始まりますしかし12番目の要素では、私はsigsegvを取得し、stl_function.h(209)のstruct equal_toに障害があります。

デバッガで私は、unordered_mapのbucket_countが11に等しいことを見てきました。おそらくそれは何かの手掛かりです。

マイコンパイラはgcc 4.6.1です。

多分あなたはの場合、unordered_map.insertにsigsegvを引き起こすことができますか?

ありがとう、貧しい私の英語についてはごめんなさい。

私が知っている場合、私は特定のコードを持ちます。

EDIT:

virtual void Insert(int arrayPlace, T value) 
{ 
    if (!isReadOnly) 
    {    
     if (IsValueDataValid(value)) 
     { 
      variables[arrayPlace] = value; 
     } 
     else 
     { 
      throw 2; 
     }    
    } 
    else 
    { 
     throw 4; 
    } 
}; 

宣言は次のとおりです: これはinsert方法である

tr1::unordered_map<int,T> variables; 

arrayPlace == 11、そして、それがどのようなvalue等しいdosn't SIGSEGVが起こりました。

+0

コンテナを間違って使用していますが、問題の原因となるコードがないと、誰もこの質問に答えられません。コードがたくさんある場合は、問題を再現するために必要な最小限の量に減らしてください。 –

+0

あなたが証明できなければ[それはあなたのせいだと思う](http://www.codinghorror.com/blog/2008/03/the-first-rule-of-programming-its-always-your-fault.html)さもないと。 –

+1

エラーは、コード内の他の場所にあります。順序付けされていないマップには何も問題はありません。 –

答えて

5

質問に対する回答は非常に簡単です。コードを正しく使用すると、セグメンテーションフォルトはstd::unordered_mapによって作成されません。ですから、質問は次のようになります:std::unordered_mapを使用した場合の典型的なユーザーエラーは何ですか?私はすぐに3つの問題を考えるでしょう:

  1. オブジェクトは値としてマップに配置されます。つまり、オブジェクトをコピー可能または移動可能にする必要があります。つまり、タイプTが正しくコピー構築を実装しているかどうかを調査します。特に、クラスにないが代入演算子またはデストラクタがある場合は、コピーコンストラクタに注意を払う必要があります。
  2. 計算されたハッシュキーは実際にはハッシュキーではなく、おそらくオブジェクトの場所に依存します。これは、オブジェクトがいくつかの拡張に移動するので面白い振る舞いを引き起こします(ただし、挿入されても、そのまま置かれます)。
  3. 前の問題と同様に、等価演算は実際には等価演算ではありません。順序付けられていないマップでは、同じハッシュコードを持つ2つのオブジェクトが実際に同じかどうかを判断するために等価演算子が必要です。

キーがintであり、ハッシュコードと平等が提供されているとすれば、私は最初の問題に集中します。つまり、std::unordered_mapの使用が本当に問題であることが判明したら、私はこれに専念するでしょう。セグメンテーション違反は、以前のものが混乱したことによってもかなり簡単に起こる可能性があります。たとえば、メモリを上書きしたり、メモリを削除したり、間違った方法でメモリを削除したりする可能性があります。このような問題を発見するには、purifyやvalgrindなどのツールが役立ちます。いずれにしても、プログラムを最小限のクラッシュの例に沸かしたいと思っています。一般的に私はこの問題がプロセスで明らかになることを知ります。

+0

あなたは、単純なint変数(入力されたもの)でもstd :: unordered_mapを使ってうまく動作するためのコンストラクタ(または存在する変数への参照)が必要であることを意味しますか? – yoni

+1

まあ、概念的には、はい。ただし、組み込み型には、すべての関連操作が暗黙的に定義されています。同様に、ハッシュと等価性が定義されています。 'T'型もint型である場合、問題はあなたが投稿したコードではなく**どこか他のところです。実際に問題を引き起こすのは検出するのが難しいです。あなたのエラー記述から、私はどこかでメモリが上書きされると思いますが、それはまったく別のものかもしれません。問題が 'std :: unordered_map 'に現れたのはちょうど良いことです。 –

+0

メソッドが終了したときにスコープから外れた 'T value 'なのではありませんか? – yoni

関連する問題