无限循环搜索C ++ std :: map

时间:2014-07-29 14:50:41

标签: c++ string map stl

我在C ++中使用以下方法检查地图上的名称

map<string, bool> namesMap;

bool IsValidName(const char* name) {

    string currentName(name, 16);

    if (MapContains(namesMap, currentName))
        return namesMap[currentName];
    else
        namesMap[currentName] = false;

    return false;
}


template<class T, class K>
bool MapContains(const std::map<T, K>& targetMap, const T key) {

    return targetMap.find(key) != targetMap.end();

}

调用IsValidName()有时会导致将线程捕获到无限循环中。我有一个内存转储,显示该线程卡在MapContains()方法中,并进一步在xtree中,std :: map内部使用。

应用程序中的所有名称长度为6-8个字符。所以这行有一个错误:

string currentName(name, 16);

这导致所有已检查的名称具有长度:16而不是正确的名称。因此,currentName在前6-8个字符中具有正确的数据,而在其余的字符中具有垃圾。因此,地图中填充了16个字符的长字符串,每个字符串中都有未定义的数据。

这种垃圾在搜索地图时是否会导致无限循环?

或其他任何可能导致它的想法?

更新 正如我上面所描述的,我知道行的问题:

string currentName(name, 16);

只是想知道它是如何导致地图有未定义的行为

1 个答案:

答案 0 :(得分:1)

您的程序有未定义的行为

string currentName(name, 16);尝试从const char*构建16个字符的字符串,仅指向6-8个字符。


<强>解决方案:

提供至少16个字符,或只是致电string currentName(name);