+ -
当前位置:首页 → 问答吧 → multimap的问题.....

multimap的问题.....

时间:2010-08-12

来源:互联网

程序运行很长时间之后在multimap操作的时候coredump了....

multimap删除代码如下
  1. multimap<string, const SDevIDMSAddr*>::iterator its;

  2.     pthread_mutex_lock(&m_IdMSAddrMapMutex);
  3.     its = m_IdMSAddrMap.find(sId);
  4.     size_t nCount = m_IdMSAddrMap.count(sId);
  5.     for(size_t i=0; i<nCount; i++)
  6.     {
  7.         if(its->second->m_sDevID == sDevId)
  8.         {
  9.             delete its->second;
  10.             its->second = NULL;
  11.             m_IdMSAddrMap.erase(its++);
  12.         }
  13.         else
  14.         {
  15.             its++;
  16.         }
  17.     }
  18.     pthread_mutex_unlock(&m_IdMSAddrMapMutex);
复制代码
程序coredump代码如下
  1. vector<string> *pTmpVec = new vector<string>;
  2.     multimap<string, const SDevIDMSAddr*>::iterator its;

  3.     pthread_mutex_lock(&m_IdMSAddrMapMutex);
  4.     for(its=m_IdMSAddrMap.begin(); its!=m_IdMSAddrMap.end(); its++)
  5.     {
  6.         if(its->second->m_sMSAddr == sMSAddr)
  7.         {
  8.             pTmpVec->push_back(its->second->m_sMCAddr);
  9.         }
  10.     }
  11.     pthread_mutex_unlock(&m_IdMSAddrMapMutex);
  12.     return pTmpVec;
复制代码
在 if(its->second->m_sMSAddr == sMSAddr)行coredump了...
gdb 查看
(gdb)p its
$6 = {<std::_Rb_tree_base_iterator> = {_M_node = 0x0}, <No data fields>}

(gdb) p m_IdMSAddrMap
$7 = {
  _M_t = {<std::_Rb_tree_base<std::pair<std::string const, SDevIDMSAddr const*>, std::allocator<std::pair<std::string const, SDevIDMSAddr const*> > >> = {<std::_Rb_tree_alloc_base<std::pair<std::string const, SDevIDMSAddr const*>, std::allocator<std::pair<std::string const, SDevIDMSAddr const*> >, true>> = {_M_header = 0x80e6468}, <No data fields>}, _M_node_count = 0,
    _M_key_compare = {<std::binary_function<std::string, std::string, bool>> = {<No data fields>}, <No data fields>}}}

可以看出m_IdMSAddrMap中的_M_node_count = 0已经为0了...
但是begin()和end()不相等, 请问有可能是什么原因导致....多谢....
函数都是静态函数.....

作者: ruchong   发布时间: 2010-08-12

删除过后迭代器无效。检查下这个

作者: wenkai169   发布时间: 2010-08-12

size_t nCount = m_IdMSAddrMap.count(sId);
已经确定迭代器是有效的吧........

作者: ruchong   发布时间: 2010-08-12

本帖最后由 wenkai169 于 2010-08-12 15:59 编辑

回复 ruchong


    nCount不是,its才是

    删除过后its++本来就有问题,而且貌似删除过后不用++的。

    ps: its是对象指针,应该使用++its更有效率

作者: wenkai169   发布时间: 2010-08-12

回复 wenkai169


    erase(its++)
是把its删除了, 再向后移动......
因为有for(..)的限制就算删除最后一个元素, 再向后移动, 也不会有问题.....

作者: ruchong   发布时间: 2010-08-12

回复 ruchong


    翻翻<effictive c++>吧,我也搞忘了

作者: wenkai169   发布时间: 2010-08-12