2014-10-28 66 views
0

我有以下問題: 我已經定義一個boost ::的multi_index_container,這裏其通過一個成員函數指針&TYPE::m_id其中m_id是積分型散列一個TYPE簡化定義boost :: multi_index_container擦除函數重新?

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函數可能會在刪除指針之前重新組合,這將導致段錯誤,因爲指針已被刪除。 (當然,解決方法是:將erasedelete這無論如何是比較合適的!)

我得到了下面最後一絲分割故障後。

最後堆棧跟蹤輸出:

[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) 

回答

1

要回答您主題行中的問題:有序索引(如您在所示代碼中使用的索引)不要哈希/重複哈希,因爲它們不是基於哈希的。散列指數(你沒有在這裏使用,似乎)不會在erase上重新散佈。您在堆棧跟蹤中顯示的符號與Boost.MultiIndex完全不同。

+0

對不起,這是hashed_unique,糾正問題 – Gabriel 2014-10-29 23:24:02

+0

ahhh,謝謝!,堆棧跟蹤確實不是來自boost :: multiindex,上帝地獄....我完全錯過了這個 – Gabriel 2014-10-29 23:26:13

0

檢查一下您是否BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING宏定義。使用此宏容器驗證內部完整性並嘗試訪問已刪除的對象。順便說一下,有序索引不能基於哈希值,但是在擦除之後真正需要重新平衡的某種樹,但通常沒有理由訪問被刪除的元素。