参考:http://www.cnblogs.com/biyeymyhjob/archive/2012/09/12/2674004.html
案例:
#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;
class Point
{
public:
Point()
{
cout << "construction" << endl;
}
Point(const Point& p)
{
cout << "copy construction" << endl;
}
~Point()
{
cout << "destruction" << endl;
}
};
int main()
{
vector<Point> pointVec;
Point a;
Point b;
pointVec.push_back(a);
pointVec.push_back(b);
cout<<pointVec.size()<<std::endl;
return 0;
}
===================
分析:
vector<Point> pointVec; 定义了一个vector容器,元素类型为Point对象,初始化容器大小为0,无元素
Point a;
Point b; 定义了两个Point对象,对应输出结果的前两行:construction
pointVec.push_back(a);
将a对象push_back到容器里,Point的拷贝构造函数被调用(因为容器里添加的是原始数据(Point a)的一份copy);
此时size为1,capacity为1
对应输出结果:copy construction
pointVec.push_back(b);
将b对象push_back到容器,但此时的pointVec并无可用空间(capacity - size = 0),
此时引发内存重新分配,而vector的机制是当前分配的是前一次的两倍,所以它会重新开辟一个空间(capacity=2),
并将之前空间里的a对象拷贝构造到新的空间,接着继续构造对象b,最后销毁之前pointVec占用的空间。此时size为2,capacity为2
对应输出结果:
copy construction
copy construction
destruction
cout<<pointVec.size()<<std::endl; // 对应输出结果:2
最后,main函数退出,pointVec依次调用Point b,Point a的析构函数,
然后最前面定义的pointVec的析构函数也会被调用(依次调用各元素的析构函数),
导致后面4条:destruction的输出语句
思考:当我们再pointVec.push_back(c),此时也会导致vector重分配,此时capacity为,4,size为3
- vector的内存释放
由于vector的内存占用空间只增不减,比如你首先分配了10,000个字节,然后erase掉后面9,999个,留下一个有效元素,但是内存占用仍为10,000个。所有内存空间是在vector析构时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以清空所有元素。但是即使clear(),vector所占用的内存空间依然如故,无法保证内存的回收。
如果需要空间动态缩小,可以考虑使用deque。如果vector,可以用swap()来帮助你释放内存。具体方法如下:
vector<Point>().swap(pointVec); //或者pointVec.swap(vector<Point> ())
ps:vector源码的一些知识