2016-06-20 7 views
-1

私は静的クラスを持っていますが、このクラスでは静的なmap<string, int>が宣言されています。 静的メソッドの1つがマップにデータを挿入します。プロセスのある時点で、このデータはオーバーライドされます。静的マップに保存された文字列がオーバーライドされています

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

データがコピーされました...あなたが示したもの以外のものは間違っています... – mark

+0

マップ値は別の方法から検索されています したがって、私は上記のコードの同じ範囲にはありません。他のメソッドは、この静的マップ内のchar *(map.find((char *)value))を探しています。 – 15412s

+2

無効なC++コードを5行追加しました。このコードがいつ、どこで、どのように呼び出されたかのコンテキスト。 [mcve]を投稿してください。 – PaulMcKenzie

答えて

1

私はこの問題がグローバル変数の初期化の順序に関係していると考えています。交換することをお勧めします。

static map<string, int> levelMap; 

と機能があります。

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

これは、他の機能はgetLevelMap()を呼び出したときにtheMapが正しく初期化されていることを保証します。

+0

それはrootのようです問題は、デストラクタがマップbuに格納されているものを出力する関数を呼び出していることですキー(std :: string)の値がすでに解放され、メモリリークが発生しました... – 15412s

関連する問題