我在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);
只是想知道它是如何导致地图有未定义的行为
答案 0 :(得分:1)
您的程序有未定义的行为。
行string currentName(name, 16);
尝试从const char*
构建16个字符的字符串,仅指向6-8个字符。
<强>解决方案:强>
提供至少16个字符,或只是致电string currentName(name);