直接抛出两句话,说明到底应该如何释放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的内存释放的更多相关文章

  1. 关于vector的内存释放问题

    以前一直想当然的以为vector 的clear()函数会保证释放vector的内存,今天网上一查资料发现完全不是我想象的那样子. 比如有如下代码: tempObject obj1; tempObjec ...

  2. 从零开始写STL—容器—vector

    从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...

  3. vector的内存释放

    转自:http://www.cnblogs.com/summerRQ/articles/2407974.html vector : C++ STL中的顺序容器,封装数组 1. vector容器的内存自 ...

  4. STL容器vector应用注意事项

    [1]提前分配足够空间以免不必要的重新分配和复制代价 关于vector容器重新分配和复制及析构释放的代价,请参见随笔<STL容器之vector>. 应用示例对比代码如下: #include ...

  5. CPP-STL:vector的内存释放

    1. vector容器的内存自增长 与其他容器不同,其内存空间只会增长,不会减小.先来看看"C++ Primer"中怎么说:为了支持快速的随机访问,vector容器的元素以连续方式 ...

  6. c++ vector的内存释放

    c++中vector的一个特点是: 内存空间只会增长,不会减小.即为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都挨着前一个元素存储.设想,如果每次vector添加一个新元素 ...

  7. STL容器 vector,list,deque 性能比较

    C++的STL模板库中提供了3种容器类:vector,list,deque对于这三种容器,在觉得好用的同时,经常会让我们困惑应该选择哪一种来实现我们的逻辑.在少量数据操作的程序中随便哪一种用起来感觉差 ...

  8. std::vector的内存释放

    先上一段代码 using namespace std; class A{ public: ~A(){ cout << "deconstruct"; }; }; #inc ...

  9. C++ STL中vector的内存机制和性能分析

    vecotr是动态数组,顾名思义他可以动态的增加自己的长度. 内存机制: 但是怎样的增加自己的长度? vector有两个函数一个是capacity()返回内存空间即缓冲区的大小,另一个是size()返 ...

随机推荐

  1. Pycharm安装及遇到的问题

    趁寒假想自学一下python语言,有人推荐eclipse+pydev但是因为java编程用了eclipse,不太想一个IDE用于多种语言开发(个人喜好),于是就下载了Pycharm,之间安装了也遇到了 ...

  2. 读书笔记 effective c++ Item 15 在资源管理类中提供对原生(raw)资源的访问

    1.为什么需要访问资源管理类中的原生资源  资源管理类是很奇妙的.它们是防止资源泄漏的堡垒,没有资源泄漏发生是设计良好的系统的一个基本特征.在一个完美的世界中,你需要依赖这样的类来同资源进行交互,绝不 ...

  3. MVC - 单点登录中间件

    本章将要和大家分享的是一个单点登录中间件,中间件听起来高深其实这里只是吧单点登录要用到的逻辑和处理流程封装成了几个方法而已,默认支持采用redis服务保存session的方式,也可以使用参数Func& ...

  4. angular : direative :comunication 指令之间的通讯

    在网络上可以找到多种指令之间的通讯 · $on,$emit,$boardcast (向上或向下冒泡) · 指令return的required (^)向上一个scope通讯,前提要先给scope一个na ...

  5. angular : ng-animate : ng-show 原理,详解

    这是我第一次写博客,请大家多多指教^^ 拷贝试试 <!DOCTYPE html> <html> <head> <meta http-equiv="C ...

  6. JS中的onclick事件

    原文链接:https://segmentfault.com/q/1010000007955542?_ea=1503986 我自己做了一下测试. 这个是在html里面直接绑定onclick事件,我打印了 ...

  7. CSS中padding和margin以及用法

    CSS中padding与margin 1.padding:内边距,表示控件内容相对于边缘的距离. 2.margin:外边距,表示控件边缘相对于父空间的边缘. 参考:http://www.studyof ...

  8. FaceNet---深度学习与人脸识别的二次结合

    今天我给大家带来一篇来自谷歌的文章,众所周知,谷歌是全世界最有情怀,最讲究技术的公司,比我们天朝的莆田广告商良心多了.还有就是前段时间的最强大脑,莆田广告商的那个小机器,也就忽悠忽悠行外人了,懂的人深 ...

  9. 消除input,button之间的间距

    代码: 效果: 问题: input,button标签之间出现了间距,这并不是我们所期望的. 解决方法: 1.在父级元素上设置属性:font-size:0px; 将input父级字体(font-size ...

  10. Android学习总结(十二)———— BaseAdapter优化

    一.BaseAdapter的基本概念 对于Android程序员来说,BaseAdapter肯定不会陌生,灵活而优雅是BaseAdapter最大的特点.开发者可以通过构造BaseAdapter并搭载到L ...