정적 클래스가 있고이 클래스에 정적 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