0

我有一个指针地图。我正在寻找一个条目,然后制作指针的本地副本并删除地图中的条目。我的问题是,如果我们找不到条目,​​这段代码会产生问题吗?

std::map<int, object*>::iterator it2 = m_Frames.find(m_num);
m_objpointer = it2->second;
m_Frames.erase (it2);
4

6 回答 6

2

我没有条目它会返回地图的结尾!所以这将是一个未定义的行为。最好这样做:

if((it2 = m_Frames.find(m_num))!=m_Frames.end())
{
  m_objpointer = it2->second;
  m_Frames.erase (it2);

}
于 2013-10-17T09:10:31.937 回答
1

it2支付点,通过调用undefine 行为m_Frames.end()取消引用它。您需要测试if 迭代器是否有效:it2->seconditerator

if (it2 != m_Frames.end())  // test if iterator is valid  
{
   //.. do stuff
   m_objpointer = it2->second;
   m_Frames.erase (it2);
}
于 2013-10-17T09:09:36.453 回答
1

是的,有问题。如果条目没有退出,则end返回迭代器,该迭代器不能被取消引用。你需要检查这种情况。

于 2013-10-17T09:09:37.767 回答
1

是的。这是未定义的行为,因为您取消引用迭代器。检查与 的相等性end

if (it2 != m_bTTEFrames.end())
{
   // do what you want
}
于 2013-10-17T09:09:42.347 回答
1

“这段代码会产生问题吗?”

的。std::map::find在这种情况下可能会返回m_Frames.end(),这是过去的元素,即您将尝试访问无效内存,这将导致未定义的行为

您应该检查是否已找到该元素,如果没有,则明确处理此类情况:

if (it2 != m_Frames.end()) {
    m_objpointer = it2->second;
    m_Frames.erase(it2);
}
else {
    // TODO: element not found
}
于 2013-10-17T09:10:35.437 回答
0

是的,除非您检查返回的值,否则这将是一个问题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);
}
于 2013-10-17T09:12:00.317 回答