对空的 unordered_map 执行 find() 会导致访问冲突吗?

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。

在我看来,访问冲突可能是由以下原因引起的:

  1. 由于映射中没有条目,因此该find()方法会生成异常。
  2. 由于映射中没有条目,因此该end()方法会生成异常。
  3. 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供您参考:我正在进行转储分析,几乎不可能重现上述问题,因此仅尝试看看会发生什么并不是一种选择。

tas*_*oor 4

find()假设无序映射在执行时没有被其他线程修改 ,则find()end()不会抛出异常或崩溃。它们的行为是针对空容器定义的。因此,仅通过调用它们是无法破坏地图的。这么说,你的测试size()是多余的。