C++地图成员验证

C++地图成员验证,c++,dictionary,stl,C++,Dictionary,Stl,我有一个共享库,它使用一个映射来存储不同的计时器ID到eventid映射 当我尝试使用lower[]操作符获取值时,代码在信号为11时崩溃 long timerId = _timerIdsMap[specifiedEvent]; 现在,当我将其更改为以下格式时 map<int, long>::iterator EventIterator; EventIterator = _timerIdsMap.find( specifiedEvent ); if(Ev

我有一个共享库,它使用一个映射来存储不同的计时器ID到eventid映射

当我尝试使用lower[]操作符获取值时,代码在信号为11时崩溃

 long timerId = _timerIdsMap[specifiedEvent];
现在,当我将其更改为以下格式时

    map<int, long>::iterator EventIterator;
    EventIterator = _timerIdsMap.find( specifiedEvent );

    if(EventIterator!=_timerIdsMap.end())
    {
            // long timerId = _timerIdsMap[specifiedEvent];
            long timerId = EventIterator->second;
            if( _timer.cancel( timerId ) < 0 )

如果密钥有效,则其工作原理相同。您的第二个代码段没有初始化您在第一个代码段中使用的映射。如果映射不存在,此行将在映射中插入成员_TimerMap[specifiedEventVal]=处理程序;我怀疑代码是在运算符[]的使用下面的一行之后不久出现的,在该行中,您使用零是因为在地图中不存在的项目上使用运算符[]而产生的。您没有显示足够的代码。您没有显示要存储到_timerIdsMap中,您显示了不同映射的代码,您没有显示迭代器选项上的else子句,您没有显示timerId是如何使用的。崩溃不是因为使用了操作符[]。我猜问题出在其他地方,只是碰巧出现在那条线上。如果该键在映射中不存在,它将添加一个默认的构造对并返回值。
bool TimerManager::start_interval_timer( TimerEventHandler* handler, int* specifiedEvent, int sec, int usec, int intervalSec, int intervalUsec)
{
    bool retVal = true;
    int specifiedEventVal = *specifiedEvent;
        long timerId = -1 ;
  _timersMap[specifiedEventVal] = handler;