Dom*_*que 5 c++ stl unordered-map dump access-violation
我正在调查由访问冲突引起的转储。
在该特定代码行上,有以下行:
if (internal_map.find(uiElemKey) == internal_map.end() ||
internal_map[uiElemKey].find(m_iPID) == internal_map[uiElemKey].end() ||
internal_map[uiElemKey][m_iPID].find(idx) == internal_map[uiElemKey][m_iPID].end()) {
Run Code Online (Sandbox Code Playgroud)
在监视窗口中,我可以看到 中的条目数量等于internal_map0。
在我看来,访问冲突可能是由以下原因引起的:
find()方法会生成异常。end()方法会生成异常。find()方法和该end()方法工作正常,但给出不同的结果,这导致出现以下情况,即发生访问冲突。我认为使用以下条件可以避免访问冲突:
if (internal_map.size() == 0 ||
internal_map.find(uiElemKey) == internal_map.end() ||
internal_map[uiElemKey].find(m_iPID) == internal_map[uiElemKey].end() ||
internal_map[uiElemKey][m_iPID].find(idx) == internal_map[uiElemKey][m_iPID].end()) {
Run Code Online (Sandbox Code Playgroud)
有人可以确认这是正确的并解释哪个原因是正确的吗?
提前致谢
PS供您参考:我正在进行转储分析,几乎不可能重现上述问题,因此仅尝试看看会发生什么并不是一种选择。
find()假设无序映射在执行时没有被其他线程修改 ,则find()或end()不会抛出异常或崩溃。它们的行为是针对空容器定义的。因此,仅通过调用它们是无法破坏地图的。这么说,你的测试size()是多余的。