我有一个指针地图。我正在寻找一个条目,然后制作指针的本地副本并删除地图中的条目。我的问题是,如果我们找不到条目,这段代码会产生问题吗?
std::map<int, object*>::iterator it2 = m_Frames.find(m_num);
m_objpointer = it2->second;
m_Frames.erase (it2);
我没有条目它会返回地图的结尾!所以这将是一个未定义的行为。最好这样做:
if((it2 = m_Frames.find(m_num))!=m_Frames.end())
{
m_objpointer = it2->second;
m_Frames.erase (it2);
}
it2
支付点,通过调用undefine 行为m_Frames.end()
取消引用它。您需要测试if 迭代器是否有效:it2->second
iterator
if (it2 != m_Frames.end()) // test if iterator is valid
{
//.. do stuff
m_objpointer = it2->second;
m_Frames.erase (it2);
}
是的,有问题。如果条目没有退出,则end
返回迭代器,该迭代器不能被取消引用。你需要检查这种情况。
是的。这是未定义的行为,因为您取消引用迭代器。检查与 的相等性end
。
if (it2 != m_bTTEFrames.end())
{
// do what you want
}
“这段代码会产生问题吗?”
是的。std::map::find
在这种情况下可能会返回m_Frames.end()
,这是过去的元素,即您将尝试访问无效内存,这将导致未定义的行为。
您应该检查是否已找到该元素,如果没有,则明确处理此类情况:
if (it2 != m_Frames.end()) {
m_objpointer = it2->second;
m_Frames.erase(it2);
}
else {
// TODO: element not found
}
是的,除非您检查返回的值,否则这将是一个问题find
。
std::map<int, object*>::iterator it2 = m_Frames.find(m_num);
if (it2 != m_Frames.end()) {
m_objpointer = it2->second;
m_Frames.erase (it2);
}