簡體   English   中英

無限循環搜索C ++ std :: map

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM