空 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.
在我看来,访问冲突可能是由以下原因引起的:
- 由于映射中没有条目,
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()) {
有人可以确认这是正确的并解释哪个原因是正确的吗?
提前致谢
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=] 在同一行代码中。
我正在调查由访问冲突引起的转储。
在该特定代码行上,有以下行:
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.
在我看来,访问冲突可能是由以下原因引起的:
- 由于映射中没有条目,
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()) {
有人可以确认这是正确的并解释哪个原因是正确的吗?
提前致谢
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=] 在同一行代码中。