zoukankan      html  css  js  c++  java
  • vector删除元素与清除内存空洞

    问题:stl中的vector容器经常造成删除假象,这对于c++程序猿来说是极其讨厌的,《effective stl》大师已经将之列为第17条,使用交换技巧来修整过剩容量。
    内存空洞这个名词是网上的学者给出的。我认为用来描写叙述这个基本现象特别easy提醒自己vector删除的这个陷阱。

    首先给出一段代码:
    35 void testvector()
    36 {
    38     vector v;
    39     v.push_back(1);
    40     v.push_back(2);
    41     cout << "v size = " << v.size() << " v capacity = " << v.capacity()  << endl;
    42     v.erase(v.begin());
    43     cout << "v size = " << v.size() << " v capacity = " << v.capacity()  << endl;
    44     vector(v).swap(v); // 清除v并且最小化它的容量
    45     cout << "v size = " << v.size() << " v capacity = " << v.capacity()  << endl;
    47 }

    结果例如以下:
    [hfx@didkey1 bin]$ ./test
    v size = 2 v capacity = 2
    v size = 1 v capacity = 2
    v size = 1 v capacity = 1

    分析:
    能够清楚地看到这个问题,在第一次 v.erase(v.begin());的时候,并没有真正释放删除元素的内存,它的容量还是存着。

    我也简单描画下这个生活中的问题——
    你拿这一个1000升的水去沙漠上旅行,開始是满的。可是,你的旅途让你的水变成了1升。并且路途中,你没有水资源让你再次灌满,那么。你一直将拖着一个1000升
    容量的大水箱,载着1升水在旅行,你是不同意自己这样做的。你仅仅有把这个水箱切了。切成10升或者1升,小点……
    vector也一样,你把水喝了。并不能把水箱也缩小,要把水箱缩小的做法——
    ——swap()交换函数完美释放内存。
    vector(v).swap(v); // 清除v并且最小化它的容量

    注意:
    a. erase()函数。仅仅能删除内容,不能改变容量大小;
    erase成员函数,它删除了itVect迭代器指向的元素,而且返回要被删除的itVect之后的迭代器,迭代器相当于一个智能指针。
    b. clear()函数,仅仅能清空内容,不能改变容量大小
    c. vector容器删除不自己主动释放内存。那么它存在内存泄露???不是的。vector在析构函数的时候。对内存进行了释放。
    d. 假设要想在删除内容的同一时候释放内存,那么你能够选择deque容器。
    e. 关于vector:
    vector相当于c++中的数组,数组在初始化的时候也须要给它一个数组空间大小,vector申请的时候将预留一个空间,比方10。在元素超过10的时候,vector自己主动将大小
    扩大到两倍。而且将元素拷贝过去。

    使用方法举例:
     vector(v).swap(v);将v的内存空洞清除
     vector().swap(v);清空vec

  • 相关阅读:
    数据中台的“自动化数据治理”时代已来
    如何利用缓存机制实现JAVA类反射性能提升30倍
    快速入门开发实现订单类图片识别结果抽象解析
    Nginx专题(1):Nginx之反向代理及配置
    Github 上热门的 Spring Boot 项目实战推荐
    设计模式之命令模式(二)
    设计模式之命令模式(一)
    设计模式之单例模式(二)
    设计模式之单例模式(一)
    好的学习带给我什么
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7048795.html
Copyright © 2011-2022 走看看