Строки, сохраненные на статической карте, переопределяются

У меня есть статический класс, статический map<string, int> объявлен в этом классе. один из статических методов вставляет данные на карту, в какой-то момент процесса эти данные переопределяются.

Символ преобразуется в строку, а затем вставляется на карту, как показано ниже:

static map <string, int>
int a =10;
const char* arg= "hello";
string toStr(arg);
map.insert(make_pair(toStr, a);

Что может привести к повреждению данных? Карта указывает на указатель строки (toStr) и не копирует его? Если да, есть ли другие варианты сохранения данных на карте без утечки памяти? malloc кажется проблематичным, поскольку у деструктора нет опции для освобождения выделенных значений.

[update] это соответствующий код, все в одном статическом классе:

static map<string, int> levelMap;

static int getLevelFromMap(const char* input)
{

    map<string, int>::const_iterator levelMap_it = levelMap.find((char*)input);
    if ( levelMap_it == levelMap.end() ) {
        return LEVEL_NOT_SET;
    }

    return levelMap_it->second;
}

static void insertToMap(const char* input, int level)
{
    string inputToStr(input);

    levelMap.insert ( make_pair(inputToStr, level) );
}

static int getLevel (const char* input)
{
    int level;

    if (input == NULL)
        return DEFAULT_LEVEL;

    level = getLevelFromMap (input);
    if ( level == LEVEL_NOT_SET ) {
        // Not in the map, check in file
        level = getLevelFromFile (input);

        if (strcmp(input, ROOT_LEVEL) == 0) {
            if (level == NOT_IN_FILE) {
                return level;
            }
            else if (level == LEVEL_NOT_SET) {
                level = DEFAULT_LEVEL;
            }

            insertToMap (ROOT_LEVEL, level);

            return level;
        }

        if (level == NOT_IN_FILE) {
            return DEFAULT_LEVEL;
        }

        if (level == LEVEL_NOT_SET) {

            unsigned int len = ((strlen(ROOT_LEVEL) > strlen(input)) ? strlen(ROOT_LEVEL) : strlen(input)) + 1;
            char parent_input[len];

            int retval = getParent(input, parent_input, sizeof(parent_input));
            if (retval == -1) {
                return DEFAULT_LEVEL;
            }

            level = getLevel (parent_input);

            if (level != NOT_IN_FILE) {
                insertToMap (input, level);
            }
        }
    }

    return level;
}

1 ответ

Что может привести к повреждению данных?

Готов поспорить, что проблема связана с порядком инициализации глобальных переменных. Я рекомендую заменить

static map<string, int> levelMap;

с функцией.

static map<string, int>& getLevelMap()
{
   static map<string, int> theMap;
   return theMap;
}

Это гарантирует, что theMap правильно инициализируется при вызове другой функции getLevelMap(),

Другие вопросы по тегам