空 unordered_map 上的 find() 会导致访问冲突吗?

Can a find() on an empty unordered_map lead to an 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()) {

在 watch-window 我可以看到 internal_map 中的条目数等于 0.

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

  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()) {

有人可以确认这是正确的并解释哪个原因是正确的吗?
提前致谢

P.s。供您参考:我正在做转储分析,几乎不可能重现提到的问题,所以只是尝试看看会发生什么不是一种选择。

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

As there are no entries in the map, the find() method generates an exception

不,如果你的程序是有效的(之前的某个地方没有 UB)find() 方法将 return 尾后迭代器等于由 return 编辑的迭代器 return =11=] 在同一行代码中。