当deRERECHENCER结果访问std :: find_if时,内存访问不良

Bad memory access when dereferencing results of std::find_if

本文关键字:访问 不良 if 内存 find deRERECHENCER 结果 std      更新时间:2023-10-16
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;
}

如果找不到匹配,则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 A map有点奇怪,至少令人困惑。


find_if

的文档

相关位:

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

返回值

迭代器到满足条件的第一个元素,或者如果找不到这样的元素。

您的实现可能就是这样:

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

但是,由于您无论如何都使用C 11,因此您可以使用任何_of。

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