直接抛出两句话,说明到底应该如何释放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. 《浅谈架构之路:单点登录 SSO》

    前言:SSO 单点登录 “半吊子”的全栈工程师又来了,技术类的文章才发表了两篇,本来想先将主攻的几个系列都开个头(Nodejs.Java.前端.架构.全栈等等),无奈博客起步太晚,写博文的时间又没有很 ...

  2. angularJS+requireJS实现controller及directive的按需加载

    最近因为项目的比较大,需要加载的js文件较多,为了提高首屏页面的加载速度,需要对js文件进行按需加载,然后网上参考了一些资料,自己也深入研究一番之后,实现了按需加载控制器js文件及指令js文件的效果: ...

  3. Javascript—②函数

    新手Perfect教程之Javascript②教程-函数 前言:上回我们是从hello world开始的,本期将会讲"函数" 在学自定义函数之前,先了解几个已经定义好的函数: 1 ...

  4. Java Web(三) 会话机制,Cookie和Session详解

    很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因可能是没能好好理解这两种会话机制,所以会一直遗忘,一直重新回过头来学习它,今天好好把他总 ...

  5. List<bean>转换Jsonarray知识心得

    使用基本的jdbc连接mysql,获取数据. 创建实体类user: package com.json; public class user { private int id; private Stri ...

  6. Ancient Cipher UVa1339

    这题就真的想刘汝佳说的那样,真的需要想象力,一开始还不明白一一映射是什么意思,到底是有顺序的映射?还是没顺序的映射? 答案是没顺序的映射,只要与26个字母一一映射就行 下面给出代码 //Uva1339 ...

  7. Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简介

    很久之前就打算开始写一下自己的技术博客了,实在抽不出时间所以计划一直搁置了,最近项目进度渐渐缓了下来,不那么忙了,也因此开始筹备自己的博客.说到这次博客的主角,也是无心插柳找到的,来源于两年前自己写的 ...

  8. iOS runtime的应用实例

      一直想弄明白runtime是怎么回事,因为面试的时候这是一道必备问题,但是平时用的机会真的少之又少,我一度以为runtime只是用来装13的利器,没什么卵用.但是随着学习的增多,发现runtime ...

  9. vpn服务搭建

    先安装pptpd服务,就是VPN连接的软件模块. 输入:yum install ppp iptables pptpd 安装完成之后 A:编辑pptpd.conf: 输入:vim /etc/pptpd. ...

  10. AlloyTouch之无限循环select插件

    写在前面 当滚动的内容很多,比如闹钟里设置秒,一共有60项.让使用者从59ms滚回01ms是一件很痛苦的事情,所以: 在列表项太多的情况下,我们希望能够有个无限循环的滚动.00ms和01ms是无缝链接 ...