C++ std::C+上的映射问题+;

C++ std::C+上的映射问题+;,c++,map,memory-management,operator-keyword,stdmap,C++,Map,Memory Management,Operator Keyword,Stdmap,我对c++上的std::map有不确定性: 我做了一个加载链接库(.so)的对象C\u配置 C_配置类有一个std::map和C_配置库有一个初始化std::map的方法 如果我使用“for”循环从C_配置访问std::map: 这是不好的 我的代码: C_Configuration::C_Configuration() { m_configuration = LoadLibrary(); // load the linked library (.so) if(m_config

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

我做了一个加载链接库(.so)的对象
C\u配置

C_配置
类有一个
std::map
C_配置库
有一个初始化
std::map
的方法

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

这是不好的

我的代码:

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) );
}
C_配置::C_配置()
{
m_configuration=LoadLibrary();//加载链接库(.so)
如果(m_配置!=NULL)
{
//调试
日志调试(“从插件加载密钥…”);
m_配置->加载键(m_配置图);
std::map::迭代器l_项;
对于(l_item=l_配置图.begin();
l_item!=l_配置_映射.end();
l_项目++)
{                
//这没关系
}
m_配置\u映射[第一个\u键]//这不正常
}
}
void C_ConfigLibrary::LoadKeys(标准::映射和p_配置映射)
{
//调试
日志调试(“加载密钥…”);
p_configuration_map.insert(std::make_pair(第一个_键,第一个_值));
//调试
LOG_DEBUG(“加载的密钥DBUS used:%s”,m_DBUS_used.c_str());
p_configuration_map.insert(std::make_pair(第二个_键,第二个_值));
}
你能帮我吗


非常感谢

第一个_键是否确实存在,或者您只是用它作为示例来说明您希望元素位于该给定键处

很可能它不起作用,因为您正在将C字符串存储为
std::map
的键。它们是通过各自的地址进行比较的,而不是字符串的实际内容,这可能是它失败的原因。您应该使用
std::string
作为映射的键


不过,您应该发布实际代码,否则只能进行猜测。很明显,这段代码并不是全部,因为您使用的是
FIRST\u KEY
等,而我们不知道它们是什么,并且您的括号数不匹配,以及不完整的语句会产生错误。

确实存在
FIRST\u KEY
吗,或者您只是用它作为一个例子来说明您希望元素位于给定的键上

很可能它不起作用,因为您正在将C字符串存储为
std::map
的键。它们是通过各自的地址进行比较的,而不是字符串的实际内容,这可能是它失败的原因。您应该使用
std::string
作为映射的键


不过,您应该发布实际代码,否则只能进行猜测。很明显,这段代码不是全部,因为您使用的是
FIRST_KEY
等,而我们不知道它们是什么,并且您的括号数不匹配,以及一个不完整的语句会产生错误。

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

您最好使用
std::string
s作为键,尽管使用
const char*
作为值是安全的


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

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

您最好使用
std::string
s作为键,尽管使用
const char*
作为值是安全的


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

这是什么意思?那是退回的吗?它会崩溃吗?此外,您的左制动器“}”过多,这不必要地降低了代码的可读性。您正在使用
m\u配置[VALUE\u KEY]
,但尚未将
VALUE\u KEY
插入地图。这就是问题所在吗?“THIS NOT OK”表示返回值为“NULL”,源代码就是一个例子,如果有一些错误为“}”,请忽略它们,代码编译并运行。我认为这是一个依赖于std::map的内存访问问题。“这不好”是什么意思?那是退回的吗?它会崩溃吗?此外,您的左制动器“}”过多,这不必要地降低了代码的可读性。您正在使用
m\u配置[VALUE\u KEY]
,但尚未将
VALUE\u KEY
插入地图。这就是问题所在吗?“THIS NOT OK”表示返回值为“NULL”,源代码就是一个例子,如果有一些错误为“}”,请忽略它们,代码编译并运行。我认为这是一个依赖于std::map的内存访问问题。或者,他可以使用strcmp作为映射排序函数(第三个映射模板参数)。或者,他可以使用strcmp作为映射排序函数(第三个映射模板参数)。非常感谢。我用std::map.You解决了这个问题
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) );
}