我的地图中的内存问题在哪里?

时间:2011-11-30 06:13:58

标签: c++

我正在从数据库加载数据并将其插入到地图中。当我尝试打印地图大小和数据时,它仍然显示大小1,只打印最后一行。之前的所有数据都会被覆盖并包含最后一个值。这里有任何指针 问题。由于公司问题,我更改了变量名称。

我也做了一些检查点。所有键值都是唯一的。

typdef long_char char[38];

for(int j = 0; j < 31; j++)
{
    sample_enum param_sub_type = result_set[j];
    long_char param_name;

    strncpy(param_name,result_set[j], sizeof(param_name));
    input_status_cd.insert(std::pair<long_char,sample_enum>(param_name, param_sub_type));      

    /*Insert Into Map */    <I suspect this may be issue but not sure>
}

/*Printing Size of map */
input_status_sd::size_type input_status_cd_size;
etlog_msg(intput_status_cd_size :] [%d]",intput_status_cd.size());

2 个答案:

答案 0 :(得分:2)

这是因为long_char被定义为char[38]所以当你插入地图时,它将使用try operator<,这将导致比较第一个字符的地址阵列。由于您在循环中创建此数组,因此很可能会分配相同的堆栈帧,因此第一个char的地址对于每个对象保持相同。因此,map认为您再次插入相同的对象时,所有先前的数据都会被覆盖。解决此问题的最简单方法是使用std::string作为long_char的typedef。

答案 1 :(得分:1)

您应该使用std::map<std::string,sample_enum>代替std::map<long_char,sample_enum>。通过这种方式,operator<的{​​{1}}将按预期工作(按字典比较)。使用std::string,您不得使用std::string复制字符串购买必须使用赋值运算符。