取消引用std :: find_if的结果时内存访问不正确

时间:2012-11-01 00:33:59

标签: c++ debugging

bool hasId(string id, vector<User>& map)
{
    User ans = *(find_if(map.begin(), map.end(), [&](User d)
    {   return (id==(d).uid());}));
    return ans.uid() == id;
}

2 个答案:

答案 0 :(得分:5)

如果未找到匹配项,那么find_if会返回last(),在您的情况下为map.end()end()不会返回有效的迭代器(它是一个超过最后一个元素的迭代器),但是您假设始终找到匹配并继续无条件地取消引用返回值。这是个问题。

您需要在取消引用之前执行检查。如果没有检查,您的函数只会假定始终找到匹配,因为ans.uid() == idfind_if的谓词(因此是多余的),所以您也可以用return true;替换整个事物。原样:)

bool hasId(string id, vector<User>& map)
{
    return map.end() != find_if(map.begin(), map.end(), [&](User d)
    {   
        return id == d.uid();
    });   
}

另一方面,调用vector一个map有点奇怪,至少令人困惑。


Documentation for find_if

相关位:

template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );
  

返回值

     

迭代器满足条件的第一个元素,如果没有找到这样的元素,则迭代。

答案 1 :(得分:4)

您的实施可能就是这样:

bool hasId(string id, vector<User>& map)
{
    return map.end() !=
           find_if(map.begin(), map.end(), [&](User d){ return d.uid()==id; });
}

但是,既然你正在使用C ++ 11,那么你可以使用any_of

return any_of(map.begin(), map.end(), [&](User d){ return d.uid()==id; });