关联式容器使用char*充当key或者value的时候

比如说map,如果使用char*当作key,或者value的时候,可能因为char*,只是指针(地址)而发生意想不到的bug,

因为一旦对这个map对象赋值,他只存储指向某个变量的指针变量,而以前的那个变量的地址如果是可重入的,那更改这个变量的同时,就会将map对象里存储的指针变量的存储更改。

#include<iostream>
using namespace std;
#include<map>
#include<string>
#pragma warning(disable:4996)
map<char*, char*>m;


string str = "1:600285,1:82200,";

int main()
{		
	string str1="";
		
		for (int i = 0; i < sizeof(str) / sizeof(char); i++)
		{
			if (str[i] == ',')
			{
				char *leftPart = strtok((char*)str1.c_str(), ":");
				char*Part = leftPart;

				while (leftPart)
				{
					
				    leftPart = strtok(NULL, ":");
					if (!leftPart)break;
			        if (!m.count(leftPart))
			     	m[leftPart] = leftPart;
				}
			 }
			else str1 += str[i];
		}
	return 0;
}

在上面的代码中str1这个变量的地址,和存储进map对象m里的key是一样的,这样在str1 += str[i];这一句的时候,可能会更改掉m中键值key和value中所指向的地址的内容。

可以在else str1 += str[i];处打断点。在调试中可以看到m的指针指向内容是发生变化的,第一次是6002851,第二次会被str1 += str[i];更改掉内容。会在600285:1后面加别的内容。

第一次的监视如下图:

第二次的监视如下图:

如果想指向的内容不被修改,可以考虑使用const,将char *leftPart = strtok((char*)str1.c_str(), ":");写为char *const leftPart=trtok((char*)str1.c_str(), ":");不过这样,下面的 leftPart = strtok(NULL, ":");就不能执行了,所以关联式容器的key和value一般不使用char *,如果想存储字符串可以考虑使用string。也可以将即可在需要的地方将char*的转换为string。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值