关闭

没有躲过的坑--正确释放vector的内存

标签: vector
1821人阅读 评论(0) 收藏 举报
分类:

vector的内存会不会泄露?
即使不泄露,怎么能缩小所占空间呢?

我们知道vector有个clear()方法?

原型:

#include <vector>
void clear();

函数clear()删除储存在vector中的所有元素. 如果vector的元素是一些object, 则它将为当前储存的每个元素调用它们各自的析构函数(destructor). 然而, 如果vector储存的是指向对象的指针, 此函数并不会调用到对应的析构函数. 在第二种情况下, 为了完全删除vector中的元素则应使用一个类似于下的循环:

std::vector<SomeObject*> aVector;
    //The elements of the vector are created with the operand 'new' at some point in the program
    [...]
    for(int i=0 ; i<aVector.size() ; i++)
        delete aVector[i];
    aVector.clear();

调用clear之后, vector的尺寸(size)将变成zero. 但它的容量(capacity)却并不发生变化, vector本身并不释放任何内存.

如果你想同时做到清空vector的元素和释放vector的容量, 你可以使用swap技巧。
这样做会创建一个临时的空vector, 它将替换希望清空的vector。

“vector 的 clear 不影响 capacity , 你应该 swap 一个空的 vector。”

vector<type>(v).swap(v);

//对于string则可能像下面这样
string(s).swap(s);

即先创建一个临时拷贝与原先的vector一致,值得注意的是,此时的拷贝 其容量是尽可能小的符合所需数据的。紧接着将该拷贝与原先的vector v进行 交换。好了此时,执行交换后,临时变量会被销毁,内存得到释放。此时的v即为原先 的临时拷贝,而交换后的临时拷贝则为容量非常大的vector(不过已经被销毁)

为了证明这一点,我写了一个程序,如下:

#include <iostream>
#include <vector>

using namespace std;

vector <string> v;
char ch;

int main()
{

    for (int i = 0; i<1000000; i++)
        v.push_back("hello vector");
    cin >> ch;

    // 此时检查内存情况 占用54M

    v.clear();
    cin >> ch;

    // 此时再次检查, 仍然占用54M

    cout << "Vector 的 容量为" << v.capacity() << endl;

    // 此时容量为 1048576

    vector<string>(v).swap(v);

    cout << "Vector 的 容量为" << v.capacity() << endl;

    // 此时容量为0
    cin >> ch;

    // 检查内存,释放了 10M+ 即为数据内存
    return 0;
}
2
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

STL中vector的内存分配与正确释放

C++ STL中的vector的内存分配与释放   1.vector的内存增长 vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,v...
  • bzhxuexi
  • bzhxuexi
  • 2014-11-03 16:07
  • 3067

正确释放Vector的内存

本文来自文章作者(@_羊仔)的投稿(原文)。 今天在看微博的时候, 有人提出了一个对于Vector内存泄露的疑问( Link)。 博主采用 Vector存储一些数据,但是发现在执行 clear()...
  • gao1440156051
  • gao1440156051
  • 2016-06-02 16:04
  • 3765

没有躲过的坑--vector使用erase后迭代器变成野指针

vector上镜率非常高,但是最近又被他fuck了一下。使用的就是vector的erase方法。erase–return value 首先需要明确一下vector的两种erase:C++98中是这...
  • wangshubo1989
  • wangshubo1989
  • 2015-11-30 23:38
  • 4912

没有躲过的坑--vector使用erase后迭代器变成野指针

没有躲过的坑--vector使用erase后迭代器变成野指针以及remove和erase的区别       本博客转载自:http://blog.csdn.net/wangshubo1989/art...
  • Allenlzcoder
  • Allenlzcoder
  • 2017-11-27 01:02
  • 61

没有躲过的坑--指针(内存泄露)

C++被人骂娘最多的就是指针。 夜深人静的时候,拿出几个使用指针容易出现的坑儿。可能我的语言描述有些让人费劲,尽量用代码说话。通过指向类的NULL指针调用类的成员函数 试图用一个null指针调用类...
  • wangshubo1989
  • wangshubo1989
  • 2015-11-04 23:47
  • 2705

STL容器vector内存的正确释放

STL容器vector是新手入门STL最常用也是最好用的容器类,其不想array需要固定大小,而是可以动态的在容器尾部或者是中间插入元素,相当的好用,但是我们往往会在一个程序中向vector中压入了很...
  • HW140701
  • HW140701
  • 2017-08-05 10:14
  • 483

STL中vector的内存分配与正确释放

C++ STL中的vector的内存分配与释放   1.vector的内存增长 vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,v...
  • bzhxuexi
  • bzhxuexi
  • 2014-11-03 16:07
  • 3067

实战c++中的vector系列--正确释放vector的内存(clear(), swap(), shrink_to_fit())

关于vector已经写的差不多了,似乎要接近尾声了,从初始化到如何添加元素再到copy元素都有所涉及,是时候谈一谈内存的释放了。 是的,对于数据量很小的vector,完全没必要自己进行主动的释放,因...
  • huangyimo
  • huangyimo
  • 2016-08-18 11:43
  • 185

没有躲过的坑--使用using namespace std的坏习惯

使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突。在C++中,变量、函数和类都是大量存在的。如果没有命名空间,这些变量、函数、类的名称将都存在于全局命名空间中,会导致很多冲突。比如,如果我...
  • wangshubo1989
  • wangshubo1989
  • 2015-11-26 21:20
  • 7855

没有躲过的坑--程序中的变量未初始化

变量未初始化是C++编程中最为常见和易犯的错误之一。但是对于全局变量,我们可以不进行初始化,这个变量会默认的用零进行初始化,但是这通常不是一个好的习惯。我们今天先不探讨全局变量还是静态全局变量。那么对...
  • wangshubo1989
  • wangshubo1989
  • 2015-11-21 14:44
  • 11649
    个人资料
    • 访问:4533413次
    • 积分:40740
    • 等级:
    • 排名:第105名
    • 原创:565篇
    • 转载:29篇
    • 译文:13篇
    • 评论:766条
    微信公众号
      我的微信公众号
      为你推荐最新的博文~更有惊喜等着你
    时光荏苒
      白驹过隙
    博客专栏
    文章分类
    百度统计
    Google Analytics