当您向stl地图添加内容时,acess []运算符可能导致段错误的情况是什么?
如何验证它。 例: 有一个类TimerManager,它维护事件的ID映射。
map<int, long> _timerIdsMap;
Struct GUI
{
TimerManager manager;
}
然后我注册了自己,它完全正常。
当我发出停止计时器的调用时,即有时会发生崩溃。
bool TimerManager::stop_timer( int specifiedEvent )
{
TRACE("TimerManager::stop_timer() Enter");
bool retVal = true;
long timerId = _timerIdsMap[specifiedEvent];
(gdb) where
#0 0x00002adb5d9585a0 in std::_Rb_tree<int, std::pair<int const, long>, std::_Select1st<std::pair<int const, long> >, std::less<int>, std::allocator<std::pair<int const, long> > >::_M_begin() () from Utils.so
#1 0x00002adb5d95954c in std::_Rb_tree<int, std::pair<int const, long>, std::_Select1st<std::pair<int const, long> >, std::less<int>, std::allocator<std::pair<int const, long> > >::lower_bound(int const&) () from Utils.so
#2 0x00002adb5d959583 in std::map<int, long, std::less<int>, std::allocator<std::pair<int const, long> > >::lower_bound(int const&) ()
from Utils.so
#3 0x00002adb5d95d6fa in std::map<int, long, std::less<int>, std::allocator<std::pair<int const, long> > >::operator[](int const&) ()
from Utils.so
#4 0x00002adb5d95657f in TimerManager::stop_timer(int) ()
我的问题是如何验证map[]
是否包含有效成员。
这就是我调用stopTimer
函数的方式:
const int TIMERID = 5;
void completeTest(GtkWidget* myWidget,GdkEvent *event,gpointer data)
{
cout<<" test is completed"<<endl;
GUI* _ptrGUI = (GUI *)data;
if(_ptrGUI!=NULL)
{
cout<<"stop timer"<<endl;
if(!_ptrGUI->_timerManager.stop_timer(TIMERID))
{
cout<<"fatal error, could not stop the timer"<<endl;
}
答案 0 :(得分:1)
这意味着您的代码中某处有undefined behaviour。可能的原因很多,可能包括:
TimerManager
对象和/或_timerIdsMap
已被销毁。一个很好的起点可能是Valgrind你的代码。
答案 1 :(得分:0)
你在这里遇到了一个段错误,因为: