C++ STL中的vector的内存分配与释放

1.vector的内存增长
 
vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说,vector容器预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每个新元素重新分配整个容器的内存空间。
 
在调用push_back时,每次执行push_back操作,相当于底层的数组实现要重新分配大小;这种实现体现到vector实现就是每当push_back一个元素,都要重新分配一个大一个元素的存储,然后将原来的元素拷贝到新的存储,之后在拷贝push_back的元素,最后要析构原有的vector并释放原有的内存。

C++ STL next_permutation的实现原理

C++ STL algorithm库中 next_permutation()用法 注意事项

C++ STL相关容器详解

C++ STL中元素替换功能的强大函数

Android NDK 调用C++ STL 模板库(修改android.mk文件) 

例如下面程序:

#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;
}


输出结果:

C++ STL中的vector的内存分配与释放

其中执行
 
pointVec.push_back(a);
此时vector会申请一个内存空间,并调用拷贝构造函数将a放到vector中
 
再调用
 
pointVec.push_back(b);
此时内存不够 需要扩大内存,重新分配内存 这时再调用拷贝构造函数将a拷贝到新的内存,再将b拷入新的内存,同时有人调用Point拷贝构造函数,最后释放原来的内存 此时调用Point的析构函数。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/f0aef3541dc5656e7d95c3562ad62b90.html