简体   繁体   中英

Infinite loop searching C++ std::map

I have the following method in C++ which checks the name at the map

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();

}

Calling IsValidName() sometimes causes to capture the thread into an infinite loop. I've got a memory dump which shows that the thread is stuck in MapContains() method and further at xtree which is internally used by std::map.

All the names at the application are 6-8 characters long. So there is a bug at the line:

string currentName(name, 16);

Which causes all the checked names to have length: 16 instead of the correct one. As a result currentName has correct data in the first 6-8 chars and garbage at the rest ones. So the map is filled with 16-characters long strings with undefined data inside each of them.

Could this garbage cause the infinite loop while searching the map?

Or any other ideas what can cause it?

Update: As I've described above I know the problem with line:

string currentName(name, 16);

Just want to know how it causes map to have undefined behaviour

Your program has undefined behavior .

The line string currentName(name, 16); attempts to build of string of 16 characters from a const char* pointing to 6-8 characters only.


Solution:

Provide at least 16 characters, or simply call string currentName(name);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM