map [] operator segfault

时间:2015-01-12 11:40:14

标签: c++ dictionary stl segmentation-fault

当您向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;
        }

2 个答案:

答案 0 :(得分:1)

这意味着您的代码中某处有undefined behaviour。可能的原因很多,可能包括:

  • TimerManager对象和/或_timerIdsMap已被销毁。
  • 某处存在内存损坏(例如,缓冲区溢出)。

一个很好的起点可能是Valgrind你的代码。

答案 1 :(得分:0)

你在这里遇到了一个段错误,因为:

  1. 您正在访问地图中不存在的元素 - 在这种情况下最好使用find方法
  2. 您没有捕获线程的异常 - 更好地捕获异常,如果您需要退出以优雅地执行它