vector,相信接触过c++的开发人员都不陌生。可以简单的理解为其是能够动态扩展的数组。闲话少叙,接下来描述曾经遇到过的一个问题。
打算使用vector来保存一批字符串,自然而然的想到了使用如下方式:
vchar用来保存字符串。先来个示例:
输出结果
vchar中保存的值可能如下所示(第一行为索引,第二行为指针):
1
2
3
0x401ed3
0x401ed9
0x401edf
内存分布可能如下:
指针
内存内容
h
e
l
o
w
r
d
c
m
下面看一下异常的代码
结果出乎意料,竟然是3个2
猛然一看,挺困惑,静下来一分析,嗯嗯,原来如此啊。如下:
vc中存储的是指针,可能如下:
0x1bee258
vector中的元素均指向同一个地址,在循环结束时,这块内存中的值也就变成了2,所以它们的值自然也就是同一个了。
找到了原因,问题自然就好解决了。一种方法,每次放入不同的指针。更简单的一种方案是,使用vector< string>来代替vector< char *>。
输出结果可能如下:
可以看到,三个对象的地址明显不是同一个,表明vs中存放的是三个不同的对象。
使用vector或其他容器的时候,如果其保存的是指针类型的数据,一定要留心。