我有一个静态类,在这个类上声明了静态map<string, int>
。
其中一个静态方法将数据插入到地图中,在该过程的某个点上,这些数据被覆盖。
char正在转换为字符串,然后插入到地图中,如下所示:
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;
}
答案 0 :(得分:1)
什么会导致数据损坏?
我愿意打赌这个问题与全局变量的初始化顺序有关。我建议更换
static map<string, int> levelMap;
带有功能。
static map<string, int>& getLevelMap()
{
static map<string, int> theMap;
return theMap;
}
这可以保证在另一个函数调用theMap
时正确初始化getLevelMap()
。