std::vector的内存释放】的更多相关文章

先上一段代码 using namespace std; class A{ public: ~A(){ cout << "deconstruct"; }; }; #include "vector" int main(){ vector<A*>a(100); A *aaa = new A; a.push_back(aaa); //a.~vector(); //a.swap(vector<A*>()); cout << a.…
以前一直想当然的以为vector 的clear()函数会保证释放vector的内存,今天网上一查资料发现完全不是我想象的那样子. 比如有如下代码: tempObject obj1; tempObject obj2; vector<tempObject> tempVector; tempVector.pushback(obj1); tempVector.pushback(obj2); tempVector.clear(); 调用clear()函数只会调用tempObject的析构函数,从而释放掉…
转自:http://www.cnblogs.com/summerRQ/articles/2407974.html vector : C++ STL中的顺序容器,封装数组 1. vector容器的内存自增长 与其他容器不同,其内存空间只会增长,不会减小.先来看看"C++ Primer"中怎么说:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储.设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间.拷贝元素.撤销…
直接抛出两句话,说明到底应该如何释放Vector占用的内存. “vector的clear不影响capacity,你应该swap一个空的vector.” <Effective STL>中的“条款17”指出: 当vector.string大量插入数据后,即使删除了大量数据(或者全部都删除,即clear) 并没有改变容器的容量(capacity),所以仍然会占用着内存. 为了避免这种情况,我们应该想办法改变容器的容量使之尽可能小的符合当前数据所需(shrink to fit).  释放方法 1.ve…
c++中vector的一个特点是: 内存空间只会增长,不会减小.即为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都挨着前一个元素存储.设想,如果每次vector添加一个新元素时,为了满足连续存放这个特性,都需要重新分配空间.拷贝元素.撤销旧空间,这样性能就会非常慢,所以,实际上分配时其容量要比当前所需容量更多,即vector预留了一些额外的存储区,这样就不必单独为每个新元素重新分配内存空间,减少开销. 另外,在vector中内存只增不减体现在 - 比如首先分配了1000…
1. vector容器的内存自增长 与其他容器不同,其内存空间只会增长,不会减小.先来看看"C++ Primer"中怎么说:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储.设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间.拷贝元素.撤销旧空间,这样性能难以接受.因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些.就是说,vector容器预留了一些额外的存储区,用于存…
在使用vector 存储char 类型时 new的数据 在vecto 执行rerase的时候或者 单项执行clear 内存是不能被释放的. 比如有下面的一个测试: class SnapshotInfo { public: std::vector<char> ImageData; public: SnapshotInfo() {} }; 下面有一个这样的vector : private: std::vector<SnapshotInfo*> m_SnapshotInfo; 往里pus…
C++ STL中的vector的内存分配与释放http://www.cnblogs.com/biyeymyhjob/archive/2012/09/12/2674004.html 1.vector的内存增长 vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储.设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间.拷贝元素.撤销旧空间,这样性能…
C++ STL 中的map,vector等内存释放问题是一个很令开发者头痛的问题,关于 stl内部的内存是自己内部实现的allocator,关于其内部的内存管理本文不做介绍,只是 介绍一下STL内存释放的问题: 记得网上有人说采用Sawp函数可以完全清除STL分配的内存,下面使用一段代码来看看 结果: 首先测试vector: void TestVector() { sleep(10); cout<<"begin vector"<<endl; size_t siz…
首先,vector与deque不同,其内存占用空间只会增长,不会减小.比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个.所有空间在vector析构时回收. 1.释放内存:    empty()是用来检测容器是否为空的,clear()可以清空所有元素.但是即使clear(),所占用的内存空间依然如故.如果你需要空间动态缩小,可以考虑使用deque.如果非要用vector,这里有一个办法: 在<effective STL>…
关于容器的处理,只是拿来用,理解不深,但是今天跑程序出了问题.释放空间未得到真正的释放.于是网上找了一些文章,解决的问题. 解决方法:使用swap 加上clear,一起释放空间. 原理:即先创建一个临时拷贝与原先的vector一致,值得注意的是,此时的拷贝(申请空间时系统分配容量)其容量是尽可能小的符合所需数据的.紧接着将该拷贝与原先的vector 进行交换.好了此时,执行交换后,临时变量会被销毁,内存得到释放.此时的v即为原先 的临时拷贝,而交换后的临时拷贝则为容量非常大的vector(不过已…
1. vector内存分配 <Effective STL>中"条款14":使用reserve来避免不必要的重新分配 关于STL容器,最神奇的事情之一是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据.(要知道这个最大值,只要调用名叫max_size的成员函数.)对于vector和string,只要需要更多空间,就以realloc等价的思想来增长.这个类似于realloc的操作有四个部分: 分配新的内存块,它有容器目前容量的几倍.在大部分实现中,vecto…
http://blog.jobbole.com/37700/ 今天在看微博的时候, 有人提出了一个对于Vector内存泄露的疑问( Link). 博主采用 Vector存储一些数据,但是发现在执行 clear() 之后内存并没有释放,于是怀疑产生了内存泄露.随后有人回复: “vector 的 clear 不影响 capacity , 你应该 swap 一个空的 vector.” 开始并不知道回复者在说什么,于是在谷歌上搜索 vector swap clear 发现已经有类似的问题出现了,并且给出…
最近在论坛看到一个提问帖子,问题是vector中存储了对象的指针,调用clear后这些指针如何删除? class Test { public: Test() {} ~Test() { cout << "Test des" << endl; } }; int main() { vector<Test*> vec; vec.push_back(new Test()); vec.push_back(new Test()); vec.push_back(ne…
关于vector已经写的差不多了,似乎要接近尾声了,从初始化到如何添加元素再到copy元素都有所涉及,是时候谈一谈内存的释放了. 是的,对于数据量很小的vector,完全没必要自己进行主动的释放,因为那样对程序的效率几乎没有影响.但是当vector中存入大量的数据后,并且都数据进行了一些操作,比如删除后,如果我们能积极主动的去释放内存,那么是非常明智的. 写到这里,应该明确了size和capacity的区别了. 现在介绍一个方法,std::vector::clear() Removes all…
今天看了primer C++的 “动态内存管理类”章节,里面的例子是模拟实现std::vector<std::string>的功能. 照抄之后发现编译不通过,有个库函数调用错误,就参考着自己写了一份简单的int版. 实现思路: 1.初始化时,容器容量为1. 2.往容器添加数据时,如果容器没有放满,就直接放进去. 3.往容器添加数据时,如果容器已经满了: 3.1 申请新的更大的存储空间(2倍) 3.2 把原来的数据复制到新的存储空间 3.3 删除旧的存储空间 3.4放入数据 代码如下: // 1…
来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作…
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. 为了可以使用vector,必须在你的头文件中包含下面的代码: #include <vector> vector属于std命名域的,因此需要通过命名限定,如下完成你的代码: using std::vector; vector<int…
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. 为了可以使用vector,必须在你的头文件中包含下面的代码: #include <vector> vector属于std命名域的,因此需要通过命名限定,如下完成你的代码: using std::vector; vector<int…
c/c++ 标准容器 vector的内存空间是如何自动增长的 vector,string,deque的内存存储机制:在一个连续的内存空间存储,所以才支持下标操作. vector的课题:由于容器的大小是可变的,当插入元素后,vector必须分配新的内存来保存已有元素和新的元素,将已有元素从旧的内存地址移动到新的内存地址,并释放掉旧的内存空间.如果我们每添加一个新元素,vector就执行一次这样的内存分配和释放操作,性能会慢到不可接受 解决方案:为了避免这种代价,标准库实现者采用了可以减少容器空间重…
蒜头君有 nn 块积木,编号分别为 11 到 nn.一开始,蒜头把第 ii 块积木放在位置 ii.蒜头君进行 mm 次操作,每次操作,蒜头把位置 bb 上的积木整体移动到位置 aa 上面.比如 11 位置的积木是 11,22 位置的积木是 22,那么把位置 22 的积木移动到位置 11 后,位置 11 上的积木从下到上依次为 1,21,2. 输入格式 第一行输入 22 个整数 n,m(1 \le n \le 10000, 0 \le m \le 10000)n,m(1≤n≤10000,0≤m≤1…
#include <iostream> #include <vector> using namespace std; int main() { // 初始化的方式 std::vector<int> vec1; //std::vector<int> vec2(1750000);// 7G std::vector<int> vec2(1*1024*1024*1024*1/4, 1);// 1G std::vector<int> vec3;…
使用vector,必须加上:#include <vector> 1.初始化vector,一般有这几种方式: std::vector<std::wstring> v1; //创建一个空的wstring类型的vector std::vector<std::wstring> v2(3, L"c"); //创建一个容量为3,全部初始化L"c" std::vector<int> v3(5); //创建容量为5,数据类型为int的…
标准C++类std::string的内存共享,值得体会: 详见大牛:https://www.douban.com/group/topic/19621165/ 顾名思义,内存共享,就是两个乃至更多的对象,共同使用一块内存: 1.关于string的内存共享问题: 通常,string类中必有一个私有成员,其是一个char*,用户记录从堆上分配内存的地址,其在构造时分配内存,在析构时释放内存. 因为是从堆上分配内存,所以string类在维护这块内存上是格外小心的,string类在返回这块内存地址时,只返…
1. 准备 使用std::vector应该知道几点: (1)内存连续的容器,有点像数组 (2)与std::list相比,插入和删除元素比较慢- 因为数据迁移 (3)添加元素可能会引发内存分配和数据迁移. 2. 问题 AnyCAD::API::PointCloudNode使用FloatList  及std::vector<float>来存储一些列的点[x0, y0, z0, x1, y1, z1, .....]: void  SetPoints (const FloatList &buf…
vector的内存增长问题,其实无非是vector中size()和capacity()问题.vector的一个缺点就是它的内存分配是按照2的倍数分配内存的.当当前容量对插入元素不够时,分配一块新的内存,这块内存的容量是原vector容量 的2倍大小,然后复制旧内存,释放旧内存,可能多次涉及拷贝构造函数和析构函数,如果一个程序需要的内存超过2G的话,那么就会出现bad_alloc错 误,从而引发程序的崩溃,而这也正是vector的劣势所在.…
标准C++类std::string的 内存共享和Copy-On-Write技术 陈皓 1. 概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母出来在你房间要检查你是否在复习时,你才真正捡起课本看书.这就是“拖延战术”,直到你非要做的时候才去做. 当然,这种事情在现实生…
标准C++类std::string的  内存共享和Copy-On-Write技术 陈皓 1. 概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里,做出一副正在复习功课的样子,其实你在干着别的诸如给班上的某位女生写情书之类的事,而一旦你的父母出来在你房间要检查你是否在复习时,你才真正捡起课本看书.这就是“拖延战术”,直到你非要做的时候才去做. 当然,这种事情在现实…
数据结构还是很早之前学的了,当时才刚学过C语言,实现得都很简单,最近决定重新打牢基础,于是重新开始实现书上的数据结构和算法. 模仿C++ Primer的StrVec以及std::vector,使用模板类+allocater分配内存,遵循“三/五原则”,期间遇到了几个小问题,记录下. 1.unsigned和signed的比较: 在实现insert操作时,写了个私有方法去把数组index处开始的元素向后移动n位.分两种情况处理,一种是容量不够需要重新分配内存,另一种是容量足够,直接向后移动. 前一种…
该程序初步演示了我对vector在分配内存的时候的理解.可能有误差,随着理解的改变,改代码可以被修改. /* 功能说明: vector的内存分配机制分析. 代码说明: vector所管理的内存地址是连续的.程序在不断的push_back的过程中,如果当前所管理的内存不能装下新的元素的时候,程序会创建更大的地址连续的空间来保存更多的元素. 这种机制会引起大量的无用的复制和删除操作.如果vector的元素为类结构的时候,他就会有很多临时变量产生.通过复制构造函数和析构函数,可以看到这些操作. 实现方…