PLZ ADD SOURCE: http://www.cnblogs.com/xdxer/p/4072056.html

今日饭后,一哥发给我一段代码,让我看看会不会有什么问题。

#include<iostream>
#include<vector>
#include<string>
using namespace std; int main() { vector<string> v; v.push_back("Hello"); string& x = v[0]; v.push_back("world"); cout<<x; return 0;
}

事实上我第一眼并没有看出什么,但是实际上vector是进行了resize 因为之前没有指定vector的大小。

 

在 v.push_back("world");之前,我们可以看到:

STL中关于vector的一点有趣的事情-LMLPHP

在v.push_back("world");之后,我们发现v所指向的内容的地址发生了改变,而且 _Last – _First 变成了 0x20 扩大了一倍,所以我断定是vector 运行了resize 进行了内存的重新分配。

STL中关于vector的一点有趣的事情-LMLPHP

 

让我们再来看看内存方面: 其中 0x 00 63 2f 51 是char *的值。

STL中关于vector的一点有趣的事情-LMLPHP

 

 

在 v.push_back("world"); 之后,该段内存被释放,并且C++还做了一件事,就是对此块内存区域进行了擦除,使用0xFE进行填充,也许是为了安全性的方面考虑吧。

STL中关于vector的一点有趣的事情-LMLPHP

 

总结一句话:写程序要一定要进行深入的考虑,BUG就在你意想不到的地方。

05-14 15:24