现象:使用map的insert插入多条数据,map的size永为1,只存一条最后数据的问题
案例如下:
string container_name
char container_size[16];
for 循环
{
//每次循环的container_name值都是不同的
ContainerSizeMap.insert(pair<string,string>(container_name,(string)container_size));
}
但是手动添加,可以添加进去,而且size大小会递增
ContainerSizeMap.insert(pair<string,string>({"111",(string)container_size}));
ContainerSizeMap.insert(pair<string,string>({"222",(string)container_size}));
map只有在key相同时才会不插入,所以初步怀疑是container_name作为key值相同了,但是明明每次的container_name
都不同,但是指针的地址是相同的,所以认为是把地址作为key了,使用%p打印出地址,确实是相同的
address:0x7f8cb1d0fe10,test190 container_size=56K 0x7f8cb1d0fe20
address:0x7f8cb1d0fe10,test104 container_size=3.0G 0x7f8cb1d0fe20
所以不能使用指针作为key值,因为map中的比较函数如下,在比较的时候,比较的也只是地址而已
template <class _Tp>
struct equal_to : public binary_function<_Tp, _Tp, bool>
{
bool
operator()(const _Tp& __x, const _Tp& __y) const
{ return __x == __y; }
};
所以如果必须使用指针作为key,必须重载比较函数。
或者把申请内存空间放在for循环里每次申请新的地址,保证每次地址都不相同。 优化代码如下
for 循环
{
char *container_name=new char[16];
char *container_size=new char[16];
//每次循环的container_name值都是不同的
ContainerSizeMap.insert(pair<string,string>((string)container_name,(string)container_size));
if(container_name!=NULL)
{
delete []container_name;
container_name = NULL;
}
if(container_size!=NULL)
{
delete []container_size;
container_size = NULL;
}
}