0

次の問題があります:boost::multi_index_container を定義しました。ここでは、整数型であるメンバ関数ポインタによって a をハッシュする単純化された定義ですTYPE&TYPE::m_idm_id

boost::multi_index::multi_index_container<
    TYPE * ,
    boost::multi_index::indexed_by<
        boost::multi_index::hashed_unique<
            boost::multi_index::tag<by_hashed_id>,
            boost::multi_index::member<TYPE, const TYPE, &TYPE::m_id>
        >
    >
> map;

次の方法でオブジェクトを削除すると:

hashMap = map.index.get<by_hashed_id>()
it = hashMap.find(30);
delete *it;          /// Delete the underlying pointer
hashMap.erase(it);  /// Delete in the map (segfault if the map is rehashed (?))

eraseこのコードは、消去がマップを再ハッシュしようとするとクラッシュするようです。ポインターが既に削除されているため、関数がポインターを削除する前に再ハッシュする可能性が あることを誰かが知っていますか? (もちろん、修正は次のとおりです。とにかくより適切なdelete下に移動します!)erase

セグメンテーション違反の後、次の最後のトレースを取得しました。

最後のスタック トレース出力:

 [a9203:03910] Signal: Segmentation fault (11)
121 [a9203:03910] Signal code: Address not mapped (1)
122 [a9203:03910] Failing at address: (nil)
123 [a9203:03910] [ 0] /lib64/libc.so.6() [0x36846329a0]
124 [a9203:03910] [ 1] /lib64/libc.so.6() [0x368468e312]
125 [a9203:03910] [ 2] /program( ZNSt10_HashtableIjSt4pairIKjN15BodyProcessInfo5FlagsEESaIS4_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS6_18_Mod    _range_hashingENS6_20_Default_ranged_hashENS6_20_Prime_rehash_policyENS6_17_Hashtable_traitsILb0ELb0ELb1EEEE5clearEv+0x3f)
4

2 に答える 2

1

件名の質問に答えるには: コードで使用しているような順序付きインデックスは、ハッシュベースではないため、ハッシュ/再ハッシュしないでください。ハッシュ化されたインデックス (ここでは使用していないようです) は で再ハッシュしませんerase。スタック トレースに表示されるシンボルは、Boost.MultiIndex とはまったく異質に見えます。

于 2014-10-29T06:58:51.573 に答える