Строки, сохраненные на статической карте, переопределяются
У меня есть статический класс, статический 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()
,