在使用vector 存储char 类型时 new的数据 在vecto 执行rerase的时候或者 单项执行clear 内存是不能被释放的。

比如有下面的一个测试:

class SnapshotInfo
{
public:
std::vector<char> ImageData;
public:
SnapshotInfo()
{} };

下面有一个这样的vector :

private:
std::vector<SnapshotInfo*> m_SnapshotInfo;

往里push 一些new的内存进去:

for (int i = ; i < ;i++)
{
SnapshotInfo *newsnap = new SnapshotInfo() ;
char * data = new char[ * ];
newsnap->ImageData.assign(data, data + * );
delete[] data;
m_SnapshotInfo.push_back(newsnap);
}

然后另一个去释放这些vector:

std::vector<SnapshotInfo*>::iterator it = m_SnapshotInfo.begin();
for (; it != m_SnapshotInfo.end();)
{ it = m_SnapshotInfo.erase(it);
}

上面的这种方式肯定释放不了 ImageData!

然后下面执行clear:

std::vector<SnapshotInfo*>::iterator it = m_SnapshotInfo.begin();
for (; it != m_SnapshotInfo.end();)
{
(*it)->ImageData.clear();
it = m_SnapshotInfo.erase(it);
}

上面clear 也不能把ImageData 给释放掉。

------------

然后在网上看到一篇文章关于vector内存释放的,然后参考了里边的释放方法利用vector::swap 进行内存的释放:

void CXiu8MonitorServerDlg::ClearVector(std::vector<char>& vt)
{
std::vector<char> vtTemp;
vtTemp.swap(vt);
}

然后:

std::vector<SnapshotInfo*>::iterator it = m_SnapshotInfo.begin();
for (; it != m_SnapshotInfo.end();)
{
ClearVector((*it)->ImageData);
it = m_SnapshotInfo.erase(it);
}

内存被成功释放!

一般用类似vector尽量用于存储指针类型,而不去存储上面类似数组的使用。

如果存储指针类型,可以直接在释放的时候 delete 掉。

但如果是上面类似数组的用法就需要特别注意内存释放的操作!

=============================================下面该文章的摘抄,(感谢作者)

2.vector的内存释放

由于vector的内存占用空间只增不减,比如你首先分配了10,000个字节,然后erase掉后面9,999个,留下一个有效元素,但是内存占用仍为10,000个。所有内存空间是在vector析构时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以清空所有元素。但是即使clear(),vector所占用的内存空间依然如故,无法保证内存的回收。

如果需要空间动态缩小,可以考虑使用deque。如果vector,可以用swap()来帮助你释放内存。具体方法如下:

vector<Point>().swap(pointVec); //或者pointVec.swap(vector<Point> ())

标准模板:

template < class T >
void ClearVector( vector< T >& vt )
{
vector< T > vtTemp;
veTemp.swap( vt );
}

swap()是交换函数,使vector离开其自身的作用域,从而强制释放vector所占的内存空间,总而言之,释放vector内存最简单的方法是vector<Point>().swap(pointVec)。当时如果pointVec是一个类的成员,不能把vector<Point>().swap(pointVec)写进类的析构函数中,否则会导致double free or corruption (fasttop)的错误,原因可能是重复释放内存。(前面的pointVec.swap(vector<Point> ())用G++编译没有通过)

3.其他情况释放内存

如果vector中存放的是指针,那么当vector销毁时,这些指针指向的对象不会被销毁,那么内存就不会被释放。如下面这种情况,vector中的元素时由new操作动态申请出来的对象指针:

#include <vector>
using namespace std; vector<void *> v;

每次new之后调用v.push_back()该指针,在程序退出或者根据需要,用以下代码进行内存的释放:

for (vector<void *>::iterator it = v.begin(); it != v.end(); it ++)
if (NULL != *it)
{
delete *it;
*it = NULL;
}
v.clear();

原文地址:https://www.cnblogs.com/biyeymyhjob/archive/2012/09/12/2674004.html

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

  1. STL vector 内存释放

    最近在论坛看到一个提问帖子,问题是vector中存储了对象的指针,调用clear后这些指针如何删除? class Test { public: Test() {} ~Test() { cout < ...

  2. vector 内存释放问题

    关于容器的处理,只是拿来用,理解不深,但是今天跑程序出了问题.释放空间未得到真正的释放.于是网上找了一些文章,解决的问题. 解决方法:使用swap 加上clear,一起释放空间. 原理:即先创建一个临 ...

  3. vector内存释放问题

    一般,如果vector中存放是的指针,那么必须先遍历一遍,释放指针所指向的内存.(如果vector的元素是内置类型,那么就没有必要做这一步) 然后在释放vector中各元素所占内存,这时候可以用swa ...

  4. vector的内存释放

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

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

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

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

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

  7. c++ vector的内存释放

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

  8. 【C++】vector内存机制和性能分析

    转自:https://blog.csdn.net/mfcing/article/details/8746256 一些好的公司校园招聘过程中(包括笔试.面试环节),经常会涉及到STL中vector的使用 ...

  9. xcode 手动管理内存 的相关知识点总结

    一.XCode4.2以后支持自动释放内存ARC xcode自4.2以后就支持自动释放内存了,但有时我们还是想手动管理内存,这如何处理呢. 很简单,想要取消自动释放,只要在  Build Setting ...

随机推荐

  1. Hive格式各种格式下不同压缩算法的比较

    原始Text格式的hive分区大小为119.2G. 压缩算法 Text格式 Parquet格式 ORC RCFile 不压缩 119.2G 54.1G 20.0G 98G Snappy压缩 30.2 ...

  2. VC的function类说明 -- 继续

    我在之前的随笔中介绍了function如何保存参数,如何实现调用相关知识.对于一个函数对象或者函数指针来说,应该很容易理解.不过对于如何在function中保存类的成员函数,这个还是值得一说的. 还是 ...

  3. 一个源文件可以写出多个class吗?编译后,会不会生成多个class文件?

    会.一个.java源文件里面可以有内部类.其他类(有且仅有一个类可以声明为public),所以编译后,可以有多个class文件.

  4. PTA2016天梯赛决赛3小时训练赛

    7-2 I Love GPLT (5 分) 这道超级简单的题目没有任何输入. 你只需要把这句很重要的话 —— I Love GPLT ——竖着输出就可以了. 所谓“竖着输出”,是指每个字符占一行(包括 ...

  5. CRM 2016 IFrame 子页面执行 父页面函数

    CRM 中定义以下函数: windows.parent.functionname(){ //do somethion } IFrame 子页面调用 JS: windows.parent.functio ...

  6. noteforjs

    轻量高效的开源JavaScript插件和库---<!-- TOC --> - [图片](#图片)- [布局](#布局)- [轮播图](#轮播图)- [弹出层](#弹出层)- [音频视频]( ...

  7. 第7章 网络层协议(3)_ARP协议

    3. ARP协议 3.1 ARP(Address Resolution Protocol)协议的工作过程和安全隐患 (1)计算机A和C通信之前,先检查ARP缓存中是否有计算机C的IP地址对应的MAC地 ...

  8. (转)C#操作Word文档

    原文1地址:http://www.cnblogs.com/lantionzy/archive/2009/10/23/1588511.html 原文2地址: http://www.cnblogs.com ...

  9. angularjs的路由ui.router

      <!-- 引入路由插件 --> <script src="vendor/angular-ui-router/release/angular-ui-router.min. ...

  10. asp mvc 导出txt 文件泛型方法

    asp mvc 导出txt 文件泛型方法分享: public static void ExportFile<T>(T obj) { StringBuilder str = new Stri ...