5

編集:解決しました、私は方法を知っていますが、理由がわかりません。

variables宣言をから変更しました

tr1::unordered_map<int,T> variables;

unordered_map<int,T> variables;

そしてそれはうまくいきます。

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

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

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

派生クラスは、基本クラスinsertメソッドを使用して、要素をunordered_map<int,int>コンテナに挿入します。

最初intはcounterのように使用し、0から開始します。最初の11個の挿入要素はOKですが、12番目の要素でsigsegvを取得しstruct equal_to、stl_function.h(209)でエラーが発生します。

デバッガーで、unordered_mapのbucket_countが11に等しいことを確認しました。おそらく、何かの手がかりになります。

私のコンパイラはgcc4.6.1です。

たぶん、あなたは一般的に何がsigsegvを引き起こす可能unordered_map.insert性があるかを書くことができますか?

ありがとう、そして私の貧弱な英語について申し訳ありません。

どちらかがわかっている場合は、特定のコードを持ってきます。

編集:これはinsert方法です:

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

宣言は次のとおりです。

tr1::unordered_map<int,T> variables;

sigsegvはarrayPlace==11のときに発生し、何がvalue等しいかは関係ありません。

4

1 に答える 1

7

質問への答えは非常に簡単です。コードを正しく使用すれば、セグメンテーション違反は発生しませんstd::unordered_map。したがって、問題は次のようになります。使用時の一般的なユーザーエラーは何std::unordered_mapですか?手元にない私はすぐに3つの問題について考えます:

  1. オブジェクトは値としてマップに配置されます。つまり、オブジェクトはコピー可能または移動可能である必要があります。つまり、T取得したタイプがコピー構築を正しく実装しているかどうかを調査します。特に、コピーコンストラクタがクラスに含まれていないが、クラスに代入演算子またはデストラクタがある場合は、コピーコンストラクタに注意を払う必要があります。
  2. 計算されるハッシュキーは実際にはハッシュキーではありませんが、オブジェクトの場所に依存する可能性があります。これにより、オブジェクトがある程度移動するため、おかしな動作が発生します(ただし、オブジェクトが挿入されると、配置されたままになります)。
  3. 前号と同様に、等式演算は実際には等式演算ではありません。順序付けされていないマップでは、同じハッシュコードを持つ2つのオブジェクトが実際に同じであるかどうかを判断するために等式演算子が必要です。

キーがであり、ハッシュコードと同等性が提供されていることを考えるとint、最初の問題に集中します。つまり、の使用が実際に問題であることが証明されたら、これに集中しますstd::unordered_map。セグメンテーション違反は、以前に混乱したことによっても非常に簡単に発生する可能性があります。たとえば、何かがメモリを上書きしたり、メモリを間違った方法で削除したりしている可能性があります。purifyやvalgrindなどのツールは、これらの問題を見つけるのに役立ちます。いずれにせよ、あなたはプログラムを最小限のクラッシュの例に要約したいと思います。通常、問題はその過程で明らかになることがわかります。

于 2012-01-07T22:50:53.870 に答える