2011-06-21 61 views
0

我有一個關於性病不確定性::地圖上C++:的std ::地圖問題,關於C++

我這樣做,加載鏈接庫(的.so)C_ConfigurationLibrary一個對象C_Configuration

C_Configuration類有一個std::mapThe C_ConfigurationLibrary有一個方法,初始化std::map

如果我接觸到std::mapC_Configuration有 「for」 循環:

std::map<const char*, const char*>::iterator l_item; 
for(l_item = m_configuration_map.begin(); 
    l_item != m_configuration.end(); 
    l_item++) 

這是可行的;

但是,如果使用:

m_configuration[VALUE_KEY] // the value is NULL 

這也不行;

我的代碼:

C_Configuration::C_Configuration() 
{ 
    m_configuration = LoadLibrary(); // load the linked library (.so) 

    if(m_configuration != NULL) 
    { 
     // DEBUG 
     LOG_DEBUG("Loading Key from plugin..."); 

     m_configuration->LoadKeys(m_configuration_map); 

     std::map <const char*, const char*>::iterator l_item; 
     for (l_item = l_configuration_map.begin(); 
       l_item != l_configuration_map.end(); 
       l_item++) 
     {     
      //THIS IS OK    
     } 

     m_configuration_map[FIRST_KEY] // THIS IS NOT OK 
    } 
} 

void C_ConfigLibrary::LoadKeys(std::map<const char*, const char*>& p_configuration_map) 
{ 
    // DEBUG 
    LOG_DEBUG("Loading Keys..."); 

    p_configuration_map.insert (std::make_pair<const char*, const char*>(FIRST_KEY, FIRST_VALUE)); 
    // DEBUG 
    LOG_DEBUG("Loaded Key DBUS used: %s",m_dbus_used.c_str()); 
    p_configuration_map.insert (std::make_pair<const char*, const char*>(SECOND_KEY,SECOND_VALUE)); 
} 

你能幫助我嗎?

感謝這麼多

+0

「這不好」是什麼意思?這是返回?它會崩潰嗎?你也有2個左邊的「太多」,這使得代碼不太直觀。 –

+0

您正在使用'm_configuration [VALUE_KEY]',但您尚未將'VALUE_KEY'插入地圖。這是問題嗎? – Naveen

+0

「這是不好的」意味着返回值是「NULL」,源代碼是一個示例,如果有一些錯誤爲「}」,請忽略它們,代碼編譯並運行。我認爲這是一個內存訪問問題,取決於std :: map。 – Gianfranco

回答

4

您正在使用const char* s作爲鍵,但指針在它們的內存地址上進行比較,而不是它們指向的文本。因此,當你在共享庫中有一個字符串字面值,並且在主應用程序對象中的字符串字面值中有相同的文本時,它們可以具有不同的地址,並且不會與鍵值相等。

儘管使用const char*作爲值可以安全使用std::string s作爲關鍵字,但要好得多。

FWIW,如果你使用const char*作爲重點,不僅是從不同的翻譯單位有時挑剔這樣的字符串常量,但你已經難以用文字從本地緩存,甚至std::string.c_str()返回值 - 它只是一個非常糟糕的主意。

+1

你是對的,非常感謝。我用std :: map 解決了這個問題。 – Gianfranco

1

是否FIRST_KEY確實存在,或者你只是使用它作爲一個例子來說明你想在給定鍵的元素?

由於您將C字符串存儲爲std::map的關鍵字,因此它可能無法正常工作。他們通過各自的地址進行比較,而不是字符串的實際內容,這可能是它失敗的原因。您應該使用std::string作爲地圖的關鍵字。

雖然你應該發佈實際的代碼,否則你只能期待猜測工作。很明顯,這段代碼並不是完整的東西,因爲你使用的是FIRST_KEY等等,但我們不知道它們是什麼,而且你有一些不匹配的括號,以及一個會產生錯誤的不完整的語句。

+1

或者,他可以使用strcmp作爲地圖排序功能(第三個地圖模板參數)。 – Benoit