地图:坏Ptr,即使找到了钥匙

map: Bad Ptr even if the key was found

本文关键字:找到了 钥匙 Ptr 地图      更新时间:2023-10-16

我有一个映射内部结构:

struct amountOfDist
{
        int time;
        vector<int> distVector;
        map<string,int> pairsMap;
};
amountOfDist m_tempDistStruct;

代码运行时,当我试图找到一个值时,它崩溃了:

if(m_tempDistStruct.pairsMap.find("(1,2)")->second != 1)
{
       ...
}

我试图通过以下方式隔离命令:

map<string,int>::iterator it;
it = m_tempDistStruct.pairsMap.find("(1,2)");

得到padptr。但是当我把断点放在这行

it = m_tempDistStruct.pairsMap.find("(1,2)");

我可以看到map包含了所有的键和值(正确的键和值),并且键(1,2)存在。

为什么find命令返回badptr ?

我很乐意得到指导。

谢谢。

如果映射确实包含你正在寻找的键,那么你的代码应该工作;如果没有,那一定是别的什么地方出了可怕的问题。然而,代码是相当脆弱的,因为它会给出未定义的行为,如果缺少密钥。

解除引用前必须检查find是否成功;如果失败,则返回一个无法解引用的过尾迭代器。或者,使用[],如果缺少一个新元素,它将插入一个新元素。

所以更安全的版本是:

// use find and check it exists
auto found = map.find(key);
if (found != map.end() && found->second != 1)
// use [] to insert if it doesn't exist
if (map[key] != 1)

如果这两种方法都不起作用,或者您绝对确定键必须存在,那么我们需要查看一个完整的测试用例,以找出您没有向我们展示的代码出了什么问题。

使用你的代码,我得到了完全正确的行为。所以我很确定你要找的值不在map .

amountOfDist m_tempDistStruct;
m_tempDistStruct.pairsMap["(1,2)"] = 10;
if  (m_tempDistStruct.pairsMap.find("(1,2)")->second == 10)
{
    cout << "GOT HERE!" << endl;
}
上面的代码片段将"(1,2)" => 10添加到映射中,然后发现它很好。我怀疑你地图上的键和你想的有微妙的不同
相关文章: