1:首先erase操作完全符合规范,是find 到迭代器it后,然后调用erase时,导致core了
2:由于需要频繁使用该map,并做erase操作,并不是每个erase会出core,而是有一定概率出现,例如操作了1万次后可能会出现
3:一下是gdb信息
(gdb) where
#0 0x000000347b55c742 in std::_Rb_tree_rebalance_for_erase () from /usr/lib64/libstdc++.so.6
#1 0x0000002a958ba076 in CSendThread::OnSubmitRespProc () from ../lib/libClientModule.so
#2 0x0000002a958bc4c2 in CSendThread::OnSocketRead () from ../lib/libClientModule.so
#3 0x0000002a958b7770 in CClientSocket::OnSocketNotifyRead () from ../lib/libClientModule.so
#4 0x0000002a958b7e1d in CClientSocket::RepetitionRun () from ../lib/libClientModule.so
#5 0x0000000000407f14 in CServiceThread::ThreadFunction ()
#6 0x0000003478206137 in start_thread () from /lib64/tls/libpthread.so.0
#7 0x0000003477bc9883 in clone () from /lib64/tls/libc.so.6
当然做了同步了啊,正因为做了同步,然后对Map操作也正确,所以才觉得纳闷
追答_Rb_tree_rebalance_for_erase就是将节点从红黑树中移除并调整平衡,这个函数很复杂,我也不懂,但是肯定不会错,仅仅从你上面的信息根本没办法看出错误,还是好好查查自己的程序吧。
linux多线程中(c++)map操作erase的时候产生core!请各位大神帮我...
这种情况一般是线程未同步引起的。STL不是线程安全的,如果你在多个线程中同时操作同一个map,你就必须自己进行同步。
c++ STL map 中erase()后++会指向那个元素?以及erase后map将会自动做什...
map的erase()有三个重载函数,你说的是哪个? 如果是根据key值来删除,成功返回1,失败返回0.如果根据迭代器删除单个,迭代器要后++,因为删除了的迭代器会失效,所以要指向下一个。如果是根据迭代器删除一片的话,要重新指定迭代器。