2014-10-28 36 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宏定义。使用此宏容器验证内部完整性并尝试访问已删除的对象。顺便说一下,有序索引不能基于哈希值,但是在擦除之后真正需要重新平衡的某种树,但通常没有理由访问被删除的元素。

相关问题