正在覆盖保存在静态地图上的字符串

时间:2016-06-20 14:24:05

标签: c++ std static-methods static-members stdmap

我有一个静态类,在这个类上声明了静态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;
}

1 个答案:

答案 0 :(得分:1)

  

什么会导致数据损坏?

我愿意打赌这个问题与全局变量的初始化顺序有关。我建议更换

static map<string, int> levelMap;

带有功能。

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

这可以保证在另一个函数调用theMap时正确初始化getLevelMap()