设为首页 加入收藏

TOP

C++ STL中的vector的内存分配与释放
2014-11-23 23:16:57 来源: 作者: 【 】 浏览:6
Tags:STL vector 内存 分配 释放

1.vector的内存增长

vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说,vector容器预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每个新元素重新分配整个容器的内存空间。

在调用push_back时,每次执行push_back操作,相当于底层的数组实现要重新分配大小;这种实现体现到vector实现就是每当push_back一个元素,都要重新分配一个大一个元素的存储,然后将原来的元素拷贝到新的存储,之后在拷贝push_back的元素,最后要析构原有的vector并释放原有的内存。


例如下面程序:


#include
#include
#include


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 pointVec;
Point a;
Point b;
pointVec.push_back(a);
pointVec.push_back(b);


cout<

return 0;
}



输出结果:



其中执行

pointVec.push_back(a);
此时vector会申请一个内存空间,并调用拷贝构造函数将a放到vector中

再调用

pointVec.push_back(b);
此时内存不够 需要扩大内存,重新分配内存 这时再调用拷贝构造函数将a拷贝到新的内存,再将b拷入新的内存,同时有人调用Point拷贝构造函数,最后释放原来的内存 此时调用Point的析构函数。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Objective-C中的meta-class 下一篇C语言用一维数组和二维数组打印杨..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: