直接抛出两句话,说明到底应该如何释放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. 创建Win32图形界面应用程序

    没有什么比创建一个Win32图形界面应用程序能让Win32汇编初学者更兴奋的了! 然而,对于像我这样没有代码便会陷入困境的人来说,看到下面的代码总能让人为之一振,百余行的代码使得Win32GUI编程并 ...

  2. Sublime Text 3 (Build 3126) 最新注册码

    Sublime Text 作为程序员开发神器,听说最新版更新了 并且增加了不少新特性.马上到官网下载了最新版 Sublime Text 3 3126 使用了下,反应速度比以前的确更快了.随手找了几个S ...

  3. 解决clipboard手机端无法复制的一种思路

    最近,做了一个切图的小项目 主要内容是微信号的推广页面,上面会有精美的图片和微信号:) 点击按钮,会复制到粘贴板上,自己去微信里面粘贴搜索:),懒人会进行一系列复杂操作么,不看好 首先,百度了一下,看 ...

  4. 如何用好消息推送为app拉新、留存、促活

    作为移动端APP产品运营最重要的运营手段,JPush消息推送被越来越多的APP厂商所重视,在信息泛滥的移动互联网时代,手机APP应用安装得越来越多,小小的手机屏幕每天收到的消息推送也越来越多,站在用户 ...

  5. AIO75产品特征与优势

    第一章 系统一体化 AIO7的核心流程由供应链.生产制造.财务成本及自动化办公构成,是迄今为止国内最完善的ERP.OA .HR .MES一体化产品.通过CRM(客户关系)及DRP(分销)扩充出“营销通 ...

  6. 使用moy快速开发后台管理系统(一)

    moy是什么? moy 是基于模型框架 kero 和 UI 框架 neoui 实现的应用框架,是前端集成解决方案,为企业级应用开发而生.github地址:iuap-design/tinper-moy ...

  7. DAX/PowerBI系列 - 父子层级(Parent-Child Hierarchy)

    DAX/PowerBI系列 - 父子层级(Parent-Child Hierarchy)参考文章见最后 难度: ◆◆◇◇◇(2星) 应用场景: 其实很多时候对数据汇总都会有层级关系的问题,不过说的不是 ...

  8. 微信公众平台跳转网页url详解

    1.利用Tomcat服务器部署项目,本地访问可以获取路径资源 2.开辟外网映射,实现全网访问 利用nat123端口映射工具 全网访问 3.将所获取的域名和端口设置到微信页面跳转的url,就完成了该项功 ...

  9. ehcache memcache redis 区别

    之前用过redis 和 memcache ,没有ehcache 的开发经验,最近也查阅不少文档和博客,写一些总结,也有不少内容总结与诸多博客中的博主总结:  Ehcache EhCache 是一个纯J ...

  10. 会话控制之session和cookie(20161107)

    注:除了登录页面,每个页面,包括处理页面也要加,为了提高安全性 session尽量不用,因为很占内存 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...