[C++]STL容器Vector的内存释放
直接抛出两句话,说明到底应该如何释放Vector占用的内存。
“vector的clear不影响capacity,你应该swap一个空的vector。”
《Effective STL》中的“条款17”指出:
当vector、string大量插入数据后,即使删除了大量数据(或者全部都删除,即clear) 并没有改变容器的容量(capacity),所以仍然会占用着内存。 为了避免这种情况,我们应该想办法改变容器的容量使之尽可能小的符合当前数据所需(shrink to fit)。
释放方法
1.vector <T> 型释放内存
通过交换的方法。
template <class T> void ClearVector(vector<T>& v);
template <class T>
void ClearVector(vector<T>& v)
{
vector<T>vtTemp;//临时变量
vtTemp.swap(v);
v.shrink_to_fit();
v.~vector<T>();
}
2.vector <T*> 型释放内存
先删除容器内的指针的内存,最后删除容器。
vector<vector<int>*> m_contourSet;//待清空的变量,略去添加数据过程 for (int i = ; i < m_contourSet.size(); i++)//清空每一个指针容器
{
vector<int>* pContour = m_contourSet[i];
vector<int> st;
pContour->swap(st);
pContour->shrink_to_fit();
pContour->~vector<int>();
st.shrink_to_fit();
st.~vector<int>();
delete pContour;//删除指针
pContour = NULL;
} ClearVector(m_contourSet);//最后清空容器
测试代码
下面的代码是在VS环境下的控制台程序,通过Visual Studio CRT测试内存泄漏,Debug模式下,在程序入口记录内存状态S1,出口处记录内存状态S2,比较S1和S2,记录在S3中,如果没有内存泄露,S3为0。实际结果当然是上面介绍的方法是正确可行的。
// TestMemoryLeak.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h> using namespace std; void FillDataOfVectorInt(vector<int>* m_Vector);
void FillDataOfVectorPointer(vector<vector<int>*>* m_Vector); template <class T> void ClearVector(vector<T>& v); int _tmain(int argc, _TCHAR* argv[])
{
_CrtMemState s1, s2, s3;
_CrtMemCheckpoint(&s1); vector<int> VectorInt;
vector<vector<int>*> VectorPointer; FillDataOfVectorInt(&VectorInt);
FillDataOfVectorPointer(&VectorPointer); //调用函数清空Vector
ClearVector(VectorInt);
//或者用下面代码
//vector<int>().swap(VectorInt);
//VectorInt.shrink_to_fit();
//VectorInt.~vector<int>(); ClearVector(VectormippPOINT3D); //先清空Vector内的指针,再清空Vector
if (!VectorPointer.empty())
{
for (int i = ; i < VectorPointer.size(); i++)
{
vector<mippPOINT3D>* pContourPoint = VectorPointer.at(i);
if (pContourPoint != NULL)
{
vector<mippPOINT3D> st;
pContourPoint->swap(st);
pContourPoint->shrink_to_fit();
pContourPoint->~vector<mippPOINT3D>();
st.shrink_to_fit();
st.~vector<mippPOINT3D>(); delete pContourPoint;//delete和new是一一对应的
pContourPoint = NULL;
}
}
}
ClearVector(VectorPointer); _CrtMemCheckpoint(&s2);
if (_CrtMemDifference(&s3, &s1, &s2))
_CrtMemDumpStatistics(&s3); return ;
} void FillDataOfVectorPointer(vector<vector<int>*>* m_Vector)
{
for (int j = ; j < ; j++)
{
vector<int>* pContourPointVec = new vector<int>;
pContourPointVec->clear();
for (int i = ; i < j + ; i++)
{
pContourPointVec->push_back(i);
}
m_Vector->push_back(pContourPointVec);
} } void FillDataOfVectorInt(vector<int>* m_Vector)
{
m_Vector->clear();
for (int i = ; i < ; i++)
{
m_Vector->push_back(i);
}
} template <class T>
void ClearVector(vector<T>& v)
{
vector<T>vtTemp;
vtTemp.swap(v);
v.shrink_to_fit();
v.~vector<T>();
}
[C++]STL容器Vector的内存释放的更多相关文章
- 关于vector的内存释放问题
以前一直想当然的以为vector 的clear()函数会保证释放vector的内存,今天网上一查资料发现完全不是我想象的那样子. 比如有如下代码: tempObject obj1; tempObjec ...
- 从零开始写STL—容器—vector
从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...
- vector的内存释放
转自:http://www.cnblogs.com/summerRQ/articles/2407974.html vector : C++ STL中的顺序容器,封装数组 1. vector容器的内存自 ...
- STL容器vector应用注意事项
[1]提前分配足够空间以免不必要的重新分配和复制代价 关于vector容器重新分配和复制及析构释放的代价,请参见随笔<STL容器之vector>. 应用示例对比代码如下: #include ...
- CPP-STL:vector的内存释放
1. vector容器的内存自增长 与其他容器不同,其内存空间只会增长,不会减小.先来看看"C++ Primer"中怎么说:为了支持快速的随机访问,vector容器的元素以连续方式 ...
- c++ vector的内存释放
c++中vector的一个特点是: 内存空间只会增长,不会减小.即为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都挨着前一个元素存储.设想,如果每次vector添加一个新元素 ...
- STL容器 vector,list,deque 性能比较
C++的STL模板库中提供了3种容器类:vector,list,deque对于这三种容器,在觉得好用的同时,经常会让我们困惑应该选择哪一种来实现我们的逻辑.在少量数据操作的程序中随便哪一种用起来感觉差 ...
- std::vector的内存释放
先上一段代码 using namespace std; class A{ public: ~A(){ cout << "deconstruct"; }; }; #inc ...
- C++ STL中vector的内存机制和性能分析
vecotr是动态数组,顾名思义他可以动态的增加自己的长度. 内存机制: 但是怎样的增加自己的长度? vector有两个函数一个是capacity()返回内存空间即缓冲区的大小,另一个是size()返 ...
随机推荐
- xml类型转换列表显示 SQL查询
数据库中存在字段类型为xml 的数据, 现举例 xml 字段存储的数据为: <MortgageInfoShipList> <ITEMS> <ITEM> <Sh ...
- [Android] "Failed to find Java version for 'C:\Windows\system32\java.exe"
Impossible to install SDK r17 on win 7 x64 "Failed to find Java version for 'C:\Windows\system3 ...
- devexpress实现单元格根据条件显示不同的样式(颜色、字体、对齐方式,大小等)
1.devexpress控件库之所以被大家所喜爱,是因为它将许多常用的东西都封装成了属性.可以通过一些简单的配置,将以前某些需要大篇幅代码才可实现的效果展示出来.这里是一个实现了将[第二列数据在表格0 ...
- ajax面试汇总
Ajax系列面试题总结: 1.Ajax 是什么? 如何创建一个Ajax? Ajax并不算是一种新的技术,全称是asychronous javascript and xml,可以说是已有技术的组合,主要 ...
- C语言中的函数、数组与指针
1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念: 函 ...
- linux 压缩zip包
压缩: zip -r 名称.zip 被压缩文件 解压: unzip 名称.zip
- VS2010在网络共享目录使用IntelliSense、ipch、sdf和SQL Compact Server相关问题
Microsoft SQL Compact Server 是专用于 Visual Studio 的单机SQL 数据库.数据库文件名的后缀为SDF. 而VS2010 拒绝在网络共享目录中建立和打开SDF ...
- Javascript基础知识小测试(一)
这里罗列了<你不知道的js>上卷的一些知识点以及小问题,如果你想巩固一下js那么就和我一起来看看吧. 如果你能不看书就回答上80%的问题说明你js的这一部分学得还不错,再接再厉. 作用域和 ...
- Pydev--unresolved import:解决办法
1.右键点击项目,选择Properties-->Pydev-Interpreter/Grammar 2.点击"Click here to configure an interprete ...
- 前端总结·基础篇·JS(三)arguments、callee、call、apply、bind及函数封装和构造函数
前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...