美文网首页
vector的内存泄露问题

vector的内存泄露问题

作者: Hades灬指尖寒 | 来源:发表于2018-06-15 13:19 被阅读0次

最近在看STL 源码剖析关于vector这一部分的时候,书中有上面这样一段代码(只截取了书中代码的一部分),注释中的是运行到当前行的输出。(编译器使用的是GCC)


#include <iostream>
#include <vector>

using namespace std;

int main(){
    int i = 0;
    vector<int> iv(2, 9);
    cout << "Size = " << iv.size() << endl; //Size = 2
    cout << "Capacity = " << iv.capacity() << endl; //Capacity = 2

    iv.push_back(1);
    cout << "Size = " << iv.size() << endl; //Size = 3
    cout << "Capacity = " << iv.capacity() << endl; //Capacity = 4

    iv.push_back(2);
    cout << "Size = " << iv.size() << endl; //Size = 4
    cout << "Capacity = " << iv.capacity() << endl; //Capacity = 4

    iv.clear();
    cout << "Size = " << iv.size() << endl; //Size = 0
    cout << "Capacity = " << iv.capacity() << endl; //Capacity = 4

    return 0;
}

  • 可以看到GCC中关于vector的自增长是采用增长为原来Capacity二倍的方式。(也在VS2017上测试了,是按原来Capacity的50%自增长的)
  • 但我注意到:在对vector进程clear操作之后,capacity的大小依然没有变,即clear只是将size置为0,其占有的内存依然没有释放,这显然产生了内存泄露的问题,在网上查找了解决方法,作下记录:

这是C++标准关于vector().clear()的说明:
Clear content
Removes all elements from the vector (which are destroyed), leaving the container with a size of 0.

A reallocation is not guaranteed to happen, and the vector capacity is not guaranteed to change due to calling this function. A typical alternative that forces a reallocation is to use swap:
vector<T>().swap(x); // clear x reallocating

使用swap后的结果:

    vector<int>().swap(iv);
    cout << "Size = " << iv.size() << endl; //Size = 0
    cout << "Capacity = " << iv.capacity() << endl; //Capacity = 0

可以看到通过swap确实回收了内存,原因是:通过一个临时的空vector与原来的iv交换,临时对象占有原来iv的内存,然后临时对象消失、原来iv占有的内存被释放,现在iv占有的是capacity=0的空间,即内存泄露问题得到解决(帅气的操作)。

相关文章

  • vector的内存泄露问题

    最近在看STL 源码剖析关于vector这一部分的时候,书中有上面这样一段代码(只截取了书中代码的一部分),注释中...

  • vector<Campaign>*p_list

    一个函数有参数vector*p_list ,导致内存泄露问题。然而让DUILIB的riched...

  • Android 内存优化总结&实践

    内存泄露 大部分的内存问题都是内存泄露导致的,Android里也有一些很常见的内存泄露问题这里简单罗列下: 详细见...

  • Java弱引用学习 WeakHashMap、ReferenceQ

    上一篇文章 Java内存泄露学习 ThreadLocal真的会内存泄露吗 提到ThreadLocal内存泄露的问题...

  • 关于华为inputMethodManager内存泄露

    一个关于内存泄露的问题,相信使用华为手机检测内存泄露的时候都会发现inputMethodManager内存泄露这个...

  • 内存泄露总结

    内存泄露会产生的问题: 1:内存泄露造成的第一个问题是异常,包括内存分配失败,OOM。 2:内存泄露造成的第二个问...

  • 内存泄露问题

    在使用系统的CF或者CA开头的类,一定要注意,自己管理内存,要不容易内存泄露 值得一提的是,今天遇到了一个比较特别...

  • Android内存泄露详解

    内存泄露 在开发应用的过程中,我们总会遇到内存泄露的问题。现在通过代码列出一些常见的内存泄露的情况以及解决方案。 ...

  • 内存泄露系列文章(一) - 内存泄露原因及影响

    前言 内存泄露系列文章内存泄露系列文章(一) - 内存泄露原因及影响内存泄露系列文章(二) - 内存泄露监测及分析...

  • 内存泄露系列文章(三) - 内存泄露解决方案

    前言 内存泄露系列文章内存泄露系列文章(一) - 内存泄露原因及影响内存泄露系列文章(二) - 内存泄露监测及分析...

网友评论

      本文标题:vector的内存泄露问题

      本文链接:https://www.haomeiwen.com/subject/gqzpeftx.html