2016-06-20 5 views
-1

У меня есть статический класс, статический 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; 
} 
+1

данные скопированы ... что-то другое, кроме того, что вы показали, ошибочно ... – mark

+0

значения карты ищутся по-другому , поэтому я не в той же области вышеприведенного кода. другой метод ищет значение char * (map.find ((char *))) в этой статической карте, которая должна содержать действительную ссылку на строки из разных методов. – 15412s

+2

Вы отправили 5 строк (недействительного) кода на C++, без контекст того, когда, где и как этот код вызывается. Пожалуйста, опубликуйте [mcve]. – PaulMcKenzie

ответ

1

Что может вызвать данные, которые будут повреждены?

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

static map<string, int> levelMap; 

с функцией.

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

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

+0

Кажется, что root проблема заключается в том, что деструктор вызывает функцию, которая печатает то, что хранится на карте, bu t значение ключа (std :: string) уже было выпущено, и это вызвало утечку памяти ... – 15412s

 Смежные вопросы

  • Нет связанных вопросов^_^