关于C ++的std :: map问题

时间:2011-06-21 09:02:27

标签: c++ map memory-management operator-keyword stdmap

我对c ++上的std :: map有一个不确定性:

我做了一个加载链接库(.so)C_Configuration的对象C_ConfigurationLibrary

C_Configuration班级有std::mapThe C_ConfigurationLibrary有一个初始化std::map的方法。

如果我使用“for”循环从std::map访问C_Configuration

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) );
}
你能帮帮我吗?

非常感谢

2 个答案:

答案 0 :(得分:4)

您使用const char*作为键,但指针会在其内存地址上进行比较,而不是它们指向的文本。因此,当您在共享库中有一个字符串文字,并且主应用程序对象中的字符串文字中有相同的文本时,它们可以具有不同的地址,并且不会比较等于键。

使用std::string作为密钥会更好,尽管使用const char*作为值是安全的。

FWIW,如果你使用const char*作为关键词,不仅来自不同翻译单位的字符串文字有时会像这样挑剔,但你很难使用本地缓冲区中的文本,甚至std::string' s .c_str()返回值 - 这只是一个非常糟糕的主意。

答案 1 :(得分:1)

FIRST_KEY是否确实存在,或者您只是将其用作示例来表明您希望该元素位于该给定键?

由于您将C字符串存储为std::map的键,因此它无法正常工作。它们通过各自的地址进行比较,而不是字符串的实际内容,这可能是它失败的原因。您应该使用std::string作为地图的关键字。

你应该发布实际代码,否则你只能期望猜测工作。显而易见,这段代码并不是全部,因为你使用FIRST_KEY等,而我们不知道它们是什么,并且你的括号数量不匹配,以及会产生不完整的陈述错误。