[英]Infinite loop searching C++ std::map
我在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);
只想知道它如何導致地圖具有未定義的行為
您的程序具有未定義的行為 。
行string currentName(name, 16);
嘗試從const char*
構建僅包含6-8個字符的16個字符的字符串。
解:
提供至少16個字符,或僅調用string currentName(name);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.