У меня есть статический класс, статический 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 представляется проблематичным, поскольку для деструктора нет возможности освобождать выделенные значения.
[обновление] это соответствующий код, все в том же статическом классе:
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;
}
данные скопированы ... что-то другое, кроме того, что вы показали, ошибочно ... – mark
значения карты ищутся по-другому , поэтому я не в той же области вышеприведенного кода. другой метод ищет значение char * (map.find ((char *))) в этой статической карте, которая должна содержать действительную ссылку на строки из разных методов. – 15412s
Вы отправили 5 строк (недействительного) кода на C++, без контекст того, когда, где и как этот код вызывается. Пожалуйста, опубликуйте [mcve]. – PaulMcKenzie