比如说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。