vc++ map操作erase不正确引发的内存位置0x02dbfcd8处的std::out_of_range?

问题
遇到个问题,程序隔段时间出现 


vc++ map操作erase不正确引发的内存位置0x02dbfcd8处的std::out_of_range,这是什么问题?

解答
根据内存地址调试进去,发现是map中的erase 引起的,找了一些资料,有用的解释:

1、假设我们定义了一个map类型的变量g_mapIsDestroyedRefCount,要访问容器中的数据项有多种方式。例如,获取g_mapIsDestroyedRefCount中key值为cameraId的值,可以这样:
g_mapIsDestroyedRefCount[cameraId]
g_mapIsDestroyedRefCount.at(cameraId)
两种写法都可以获取key为cameraId的value,一般效果看不出来差别,但是当g_mapIsDestroyedRefCount中不存在key为cameraId的<key, value>时就会出现“std::out_of_range”访问越界问题。

2、在erase删除iterator写法要注意.

A、先把it的值赋值给一个临时变量做为传递给erase的参数变量

B、因为参数处理优先于函数调用,所以接下来执行了it++操作,也就是it现在已经指向了下一个地址。

C、再调用erase函数,释放掉第一步中保存的要删除的it的值的临时变量所指的位置。


如果只是mapTest.erase(it); 当这条语句执行完后,it就是一个非法指针,如果再执行++就会出错