• c++ vector的内存释放


     

      c++中vector的一个特点是: 内存空间只会增长,不会减小。即为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都挨着前一个元素存储设想,如果每次vector添加一个新元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能就会非常慢,所以,实际上分配时其容量要比当前所需容量更多,即vector预留了一些额外的存储区,这样就不必单独为每个新元素重新分配内存空间,减少开销。 另外,在vector中内存只增不减体现在 - 比如首先分配了10000个字节,然后erase掉后面9999个,留下一个有效元素,但是实际上内存占用仍然为10000个,所有内存空间是在vector析构的时候才能被系统回收。所以,即使使用clear,vector所占用的内存空间依然如故,无法保证内存的回收。

      当然,对于数据量很小的vector,完全没有必要进行主动释放,就比如200 * 200的网格计算,就是没有必要的,但是如果是1000 * 1000,那么就是前者的25倍了,这时就需要进行主动内存释放了。

      另外,既然要进行内存释放,我们不得不掌握size()和capacity()方法的区别,前者是实际的vector元素个数,后者是实际占用内存的个数,一般来说,capacity()是大于或等于size()的。

      所以,我们可以使用swap()来帮助释放内存,具体方法如下:

    #include <iostream>
    #include <windows.h>
    #include <vector>
    using namespace std;
    struct GrainRho
    {
        int key;
        double rho;
    };
    
    int main() {
        static vector<struct GrainRho> rhovec;
    
        static vector<struct GrainRho>::iterator itrho;
    
        GrainRho grainRho;
        
        for (int i = 0; i < 100; i++) {
            grainRho = {i, 0.5 + double(i)};
            rhovec.push_back(grainRho);
        }
    
        rhovec.clear();
        cout << "rhovec.size(): " << rhovec.size() << endl;
        cout << "rhovec.capacity(): " << rhovec.capacity() << endl;
    
        vector<struct GrainRho>().swap(rhovec);
    
        grainRho = {1995, 6.28};
        rhovec.push_back(grainRho);
        cout << "rhovec.size(): " << rhovec.size() << endl;
        cout << "rhovec.capacity(): " << rhovec.capacity() << endl;
    
        system("pause");
    }

    如上所示,首先我们给这个rhovec存入了很多元素,然后调用clear()函数,但是实际上内存还是没有释放而是继续占用的,所以,我们使用 “vector<struct GrainRho>().swap(rhovec)” 来释放内存,最后又存入一个grainRho,所以最终结果只有一个grainRho占用内存。

    最终结果如下所示:

    rhovec.size(): 0
    rhovec.capacity(): 128
    rhovec.size(): 1
    rhovec.capacity(): 1

    如上所示,我们就很好的解决了内存占用问题! 

      

  • 相关阅读:
    Centos7端口查看相关
    Redis线程安全问题
    利用redis 分布式锁 解决集群环境下多次定时任务执行
    分布式锁的几种实现方式~
    什么是 CI/CD? (持续集成/持续交付)
    Java JDBC 中获取 ResultSet 的大小
    BeetleX之XRPC使用详解
    事件驱动框架EventNext之线程容器
    BeetleX之快速构建Web多房间聊天室
    BeetleX之TCP服务应用详解
  • 原文地址:https://www.cnblogs.com/zhuzhenwei918/p/9082455.html
Copyright © 2020-2023  润新知