2016-06-20 2 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; 
} 

이것은 또 다른 기능은 getLevelMap()를 호출 할 때 theMap가 제대로 초기화되는 것을 보장합니다.

+0

그것은 루트처럼 보입니다. 문제는 소멸자가지도 bu에 저장된 것을 출력하는 함수를 호출한다는 것입니다. 키 (std :: string) 값이 이미 해제되었고 메모리 누수가 발생했습니다 ... – 15412s

관련 문제