【问题标题】:Does erasing an element from one index deletes corresponding entry from second index boost::multi_index从一个索引中删除一个元素是否会从第二个索引中删除相应的条目 boost::multi_index
【发布时间】:2020-01-04 12:48:48
【问题描述】:

我定义了这个多索引,由于大量条目而占用了大量内存,我想根据一些决策检查从中删除一些条目,这可能吗?如何实现? 我正在执行以下操作,但在擦除时崩溃,附加堆栈跟踪

    typedef boost::multi_index::multi_index_container<
        Node,
        boost::multi_index::indexed_by<
            boost::multi_index::hashed_non_unique<
            boost::multi_index::tag<IndexByName>,
            boost::multi_index::member<
                Node, std::string, &Node::_name
            >
            >,
            boost::multi_index::hashed_unique<
                boost::multi_index::tag<IndexByObj>,
            boost::multi_index::const_mem_fun<
                Node, unsigned long long, &Node::key
            >
            >
        >
        > NameObjMultiIndex;

        typedef typename NameObjMultiIndex::template index<IndexByName>::type NameIndex;
        typedef typename NameObjMultiIndex::template index<IndexByObj>::type ObjIndex;
NameObjMultiIndex _cache;
std::unordered_map<N, bool>::type ChangeObjMap; // Templatised
ChangeObjMap _changeObjMap;

擦除:

ObjIndex& objIndex = _cache.template get<IndexByObj>();
typename ChangeObjMap::iterator cit = _changeObjMap.begin();
cout<< "cache size before erase: " << _cache.size() << std::endl;
for(;cit != _changeObjMap.end();cit++)
{
    if(!cit->second){
        typename ObjIndex::iterator nit = objIndex.find((unsigned long long)cit->first.get());
        objIndex.erase((unsigned long long)cit->first.get());
        //if(nit != objIndex.end())
        //nameIndex.erase(nit->_name);
    }
}

堆栈跟踪:

Thread 1 (Thread 0x2aaabe1bd8e0 (LWP 10598)):
#0  0x000000000a12994a in snps_boost_1_68_0::multi_index::detail::hashed_index_base_node_impl<std::allocator<char> >::prior() ()
#1  0x000000000a12ba51 in snps_boost_1_68_0::multi_index::detail::hashed_index_node_alg<snps_boost_1_68_0::multi_index::detail::hashed_index_node_impl<std::allocator<char> >, snps_boost_1_68_0::multi_index::detail::hashed_unique_tag>::is_last_of_bucket(snps_boost_1_68_0::multi_index::detail::hashed_index_node_impl<std::allocator<char> >*) ()
#2  0x000000000a13044f in void snps_boost_1_68_0::multi_index::detail::hashed_index_node_alg<snps_boost_1_68_0::multi_index::detail::hashed_index_node_impl<std::allocator<char> >, snps_boost_1_68_0::multi_index::detail::hashed_unique_tag>::unlink<snps_boost_1_68_0::multi_index::detail::default_assigner>(snps_boost_1_68_0::multi_index::detail::hashed_index_node_impl<std::allocator<char> >*, snps_boost_1_68_0::multi_index::detail::default_assigner&) ()
#3  0x000000000a12f589 in snps_boost_1_68_0::multi_index::detail::hashed_index_node_alg<snps_boost_1_68_0::multi_index::detail::hashed_index_node_impl<std::allocator<char> >, snps_boost_1_68_0::multi_index::detail::hashed_unique_tag>::unlink(snps_boost_1_68_0::multi_index::detail::hashed_index_node_impl<std::allocator<char> >*) ()
#4  0x000000000a56d2cc in snps_boost_1_68_0::multi_index::detail::hashed_index<snps_boost_1_68_0::multi_index::const_mem_fun<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, unsigned long long, &(Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node::key() const)>, snps_boost_1_68_0::hash<unsigned long long>, std::equal_to<unsigned long long>, snps_boost_1_68_0::multi_index::detail::nth_layer<2, Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, snps_boost_1_68_0::multi_index::indexed_by<snps_boost_1_68_0::multi_index::hashed_non_unique<snps_boost_1_68_0::multi_index::tag<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByName, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::strip_escape_name_extractor, mpl_::na, mpl_::na>, snps_boost_1_68_0::multi_index::hashed_unique<snps_boost_1_68_0::multi_index::tag<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByObj, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, snps_boost_1_68_0::multi_index::const_mem_fun<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, unsigned long long, &(Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node::key() const)>, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node> >, snps_boost_1_68_0::mpl::v_item<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByObj, snps_boost_1_68_0::mpl::vector0<mpl_::na>, 0>, snps_boost_1_68_0::multi_index::detail::hashed_unique_tag>::unlink(snps_boost_1_68_0::multi_index::detail::hashed_index_node<snps_boost_1_68_0::multi_index::detail::index_node_base<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, std::allocator<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node> >, snps_boost_1_68_0::multi_index::detail::hashed_unique_tag>*) ()
#5  0x000000000a565c9d in snps_boost_1_68_0::multi_index::detail::hashed_index<snps_boost_1_68_0::multi_index::const_mem_fun<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, unsigned long long, &(Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node::key() const)>, snps_boost_1_68_0::hash<unsigned long long>, std::equal_to<unsigned long long>, snps_boost_1_68_0::multi_index::detail::nth_layer<2, Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, snps_boost_1_68_0::multi_index::indexed_by<snps_boost_1_68_0::multi_index::hashed_non_unique<snps_boost_1_68_0::multi_index::tag<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByName, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::strip_escape_name_extractor, mpl_::na, mpl_::na>, snps_boost_1_68_0::multi_index::hashed_unique<snps_boost_1_68_0::multi_index::tag<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByObj, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, snps_boost_1_68_0::multi_index::const_mem_fun<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, unsigned long long, &(Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node::key() const)>, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node> >, snps_boost_1_68_0::mpl::v_item<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByObj, snps_boost_1_68_0::mpl::vector0<mpl_::na>, 0>, snps_boost_1_68_0::multi_index::detail::hashed_unique_tag>::erase_(snps_boost_1_68_0::multi_index::detail::hashed_index_node<snps_boost_1_68_0::multi_index::detail::index_node_base<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, std::allocator<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node> >, snps_boost_1_68_0::multi_index::detail::hashed_unique_tag>*) ()
#6  0x000000000a55d734 in snps_boost_1_68_0::multi_index::detail::hashed_index<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::strip_escape_name_extractor, snps_boost_1_68_0::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, snps_boost_1_68_0::multi_index::detail::nth_layer<1, Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, snps_boost_1_68_0::multi_index::indexed_by<snps_boost_1_68_0::multi_index::hashed_non_unique<snps_boost_1_68_0::multi_index::tag<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByName, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::strip_escape_name_extractor, mpl_::na, mpl_::na>, snps_boost_1_68_0::multi_index::hashed_unique<snps_boost_1_68_0::multi_index::tag<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByObj, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, snps_boost_1_68_0::multi_index::const_mem_fun<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, unsigned long long, &(Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node::key() const)>, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node> >, snps_boost_1_68_0::mpl::v_item<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByName, snps_boost_1_68_0::mpl::vector0<mpl_::na>, 0>, snps_boost_1_68_0::multi_index::detail::hashed_non_unique_tag>::erase_(snps_boost_1_68_0::multi_index::detail::hashed_index_node<snps_boost_1_68_0::multi_index::detail::hashed_index_node<snps_boost_1_68_0::multi_index::detail::index_node_base<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, std::allocator<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node> >, snps_boost_1_68_0::multi_index::detail::hashed_unique_tag>, snps_boost_1_68_0::multi_index::detail::hashed_non_unique_tag>*) ()
#7  0x000000000a551213 in snps_boost_1_68_0::multi_index::multi_index_container<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, snps_boost_1_68_0::multi_index::indexed_by<snps_boost_1_68_0::multi_index::hashed_non_unique<snps_boost_1_68_0::multi_index::tag<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByName, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::strip_escape_name_extractor, mpl_::na, mpl_::na>, snps_boost_1_68_0::multi_index::hashed_unique<snps_boost_1_68_0::multi_index::tag<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByObj, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, snps_boost_1_68_0::multi_index::const_mem_fun<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, unsigned long long, &(Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node::key() const)>, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node> >::erase_(snps_boost_1_68_0::multi_index::detail::hashed_index_node<snps_boost_1_68_0::multi_index::detail::hashed_index_node<snps_boost_1_68_0::multi_index::detail::index_node_base<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, std::allocator<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node> >, snps_boost_1_68_0::multi_index::detail::hashed_unique_tag>, snps_boost_1_68_0::multi_index::detail::hashed_non_unique_tag>*) ()
#8  0x000000000a5448d2 in snps_boost_1_68_0::multi_index::detail::index_base<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, snps_boost_1_68_0::multi_index::indexed_by<snps_boost_1_68_0::multi_index::hashed_non_unique<snps_boost_1_68_0::multi_index::tag<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByName, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::strip_escape_name_extractor, mpl_::na, mpl_::na>, snps_boost_1_68_0::multi_index::hashed_unique<snps_boost_1_68_0::multi_index::tag<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByObj, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, snps_boost_1_68_0::multi_index::const_mem_fun<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, unsigned long long, &(Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node::key() const)>, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node> >::final_erase_(snps_boost_1_68_0::multi_index::detail::hashed_index_node<snps_boost_1_68_0::multi_index::detail::hashed_index_node<snps_boost_1_68_0::multi_index::detail::index_node_base<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, std::allocator<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node> >, snps_boost_1_68_0::multi_index::detail::hashed_unique_tag>, snps_boost_1_68_0::multi_index::detail::hashed_non_unique_tag>*) ()
#9  0x000000000a53be45 in snps_boost_1_68_0::multi_index::detail::hashed_index<snps_boost_1_68_0::multi_index::const_mem_fun<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, unsigned long long, &(Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node::key() const)>, snps_boost_1_68_0::hash<unsigned long long>, std::equal_to<unsigned long long>, snps_boost_1_68_0::multi_index::detail::nth_layer<2, Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, snps_boost_1_68_0::multi_index::indexed_by<snps_boost_1_68_0::multi_index::hashed_non_unique<snps_boost_1_68_0::multi_index::tag<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByName, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::strip_escape_name_extractor, mpl_::na, mpl_::na>, snps_boost_1_68_0::multi_index::hashed_unique<snps_boost_1_68_0::multi_index::tag<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByObj, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, snps_boost_1_68_0::multi_index::const_mem_fun<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, unsigned long long, &(Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node::key() const)>, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node> >, snps_boost_1_68_0::mpl::v_item<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::IndexByObj, snps_boost_1_68_0::mpl::vector0<mpl_::na>, 0>, snps_boost_1_68_0::multi_index::detail::hashed_unique_tag>::erase(snps_boost_1_68_0::multi_index::detail::hashed_index_iterator<snps_boost_1_68_0::multi_index::detail::hashed_index_node<snps_boost_1_68_0::multi_index::detail::index_node_base<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node, std::allocator<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node> >, snps_boost_1_68_0::multi_index::detail::hashed_unique_tag>, snps_boost_1_68_0::multi_index::detail::bucket_array<std::allocator<Monet::MdmNameCacheImplMIWithStripEscape<Monet::MdmIndexWrapper<Monet::MdmPort> >::Node> >, snps_boost_1_68_0::multi_index::detail::hashed_index_global_iterator_tag>) ()

【问题讨论】:

  • 你能建议@joaquín-m-lópez-muñoz
  • 需要更多的上下文才能看到发生了什么。请在使用它们之前声明您的变量。 (_cache是什么?_changeObjMap?)
  • @JaMiT _cache 是多索引容器,即 NameObjMultiIndex _cache 我想删除一些元素以减少容器占用的 malloc 内存,所以,如果我从一个索引中删除,它是否也会从第二个索引中删除?此外,我在擦除时崩溃了,请参阅代码
  • 我看到您发布的代码,它使用了尚未声明的变量。所以对我没用。 请在使用前声明您的变量。
  • @JaMiT 更新变量

标签: c++ memory boost multi-index boost-multi-index


【解决方案1】:

至于您帖子的主题问题

从一个索引中删除一个元素是否会从第二个索引中删除对应的条目 boost::multi_index[?]

答案是:

是的。擦除 multi_index_container 中的元素,无论您通过哪个索引擦除,都会导致该元素同时从 所有 索引中消失。

现在,您帖子的正文继续不完整地描述了一种情况,总结如下:

  • 您有一个 _changeObjMap 映射,它存储了一个名为 _cache 的单独 multi_index_containerNode 元素的键。
  • 代码遍历_changeObjMap 并调用_cache.get&lt;IndexByObj&gt;().erase(k) 以获取在_changeObjMap 遍历期间遇到的一些k

你的帖子正文中的我的 cmets:

  • 我看不出代码与主题问题有何关联。
  • 您尝试执行的操作 - 根据存储在其他位置的密钥擦除 multi_index_container 的元素 - 原则上似乎没问题。
  • 您的代码崩溃的原因无法从您发布的不完整、无法编译的 sn-p 中推断出来。我建议您提供MCVE。引起我注意的一个特别之处是ChangeObjMap 的定义,因为一些std::unordered_map&lt;N, bool&gt;::typestd::unordered_map 没有嵌套的type typedef,所以我很确定你不是从真实代码中复制和粘贴。

【讨论】:

  • 至于代码与主题的关系,我看不到所有分配在多索引群体中的 malloc 内存,返回给操作系统,我认为这可能只是因为我是仅从一个索引中删除。 ChangeObjMap 具有与多索引容器的索引之一相同类型的键,即IndexByObj。依赖于此,我正在从多索引中删除一些元素。代码不会因我拥有的小测试用例而崩溃,而是在大型测试用例上运行,根据附加的堆栈跟踪在擦除时崩溃
  • 您的帖子涉及两个不相关的问题:内存未返回到操作系统(与multi_index_container 索引无关)和在erase 上崩溃,这可能与erase 本身,但这是由于之前对容器和/或其元素的一些非法操作。我建议你把这件事分成两个独立的问题,每个问题都有自己的 MCVE。
  • 让我们把崩溃放在一边,我想知道从容器中删除一些元素会减少使用的 malloc 内存吗?在这种情况下,rehash 有用吗?
猜你喜欢
  • 1970-01-01
  • 2020-03-20
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 2017-09-20
  • 2023-02-23
相关资源
最近更新 更多