zoukankan      html  css  js  c++  java
  • vector 内存分配和释放

    最近学习了Vector的使用,在通用函数的背后,你了解它的工作机理么,你能回答下面几个问题么。如何不慎清楚,请看下文之简单剖析。后续问题和疑问,将在文后补充。

    Q:是嵌套的vector数组中的二级vector在一级vector删除时需不需要手动删除?
    A:释放遵循有内到外,只有vector存的是指针时才需要释放,其它不需要释放


    Q:erase clear 能释放内存么?
    earse 是不释放内存的 仅仅清理数据
    可是使用clear释放vector内存有是问题的,可参考c++标准:
    clear只是将vector的size置零,可是并不保证capacity为零,因此clear并不能释放vector已经申请的内存。可使用vector<T>().swap(x)完成释放内存的操作。
    考虑用swap()来帮助释放内存‘

    C++ vector 内存分配与回收机制

    https://blog.csdn.net/sinat_33718563/article/details/77869145

    https://blog.csdn.net/wskzgz/article/details/113122684    // c++ vector内存分配、内存分布堆栈
    1. vector内存增长


    vector所有的内存相关问题都可以归结于它的内存增长策略。vector有一个特点就是:内存空间只会增长不会减少。vector有两个函数,一个是capacity(),
    返回对象缓冲区(vector维护的内存空间)实际申请的空间大小,另一个size(),返回当前对象缓冲区存储数据的个数。
    对于vector来说,capacity是永远大于等于size的,但capacity和size相等时,vector就会扩容,capacity变大。
    比如说vector最常用的push_back操作,它的整个过程是怎么一个机制呢?这个问题经常在面试中出现。
    这个问题其实很简单,在调用push_back时,若当前容量已经不能够放入新的元素(capacity=size),那么vector会重新申请一块内存,把之前的内存里的元素拷贝到新的内存当中,
    然后把push_back的元素拷贝到新的内存中,最后要析构原有的vector并释放原有的内存。
    所以说这个过程的效率是极低的,为了避免频繁的分配内存,C++每次申请内存都会成倍的增长,例如之前是4,那么重新申请后就是8,以此类推。当然不一定是成倍增长


    在调用push_back时,每次执行push_back操作,相当于底层的数组实现要重新分配大小;
    这种实现体现到vector实现就是每当push_back一个元素,都要重新分配一个大一个元素的存储,
    然后将原来的元素拷贝到新的存储,之后在拷贝push_back的元素,最后要析构原有的vector并释放原有的内存。

    2. 内存释放


    就像前面所说的,vector的内存空间是只增加不减少的,我们常用的操作clear()和erase(),实际上只是减少了size(),清除了数据,并不会减少capacity,所以内存空间没有减少。
    那么如何释放内存空间呢,正确的做法是swap()操作。
    标准模板如下

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

    例子:

    vector<int> nums;
    nums.push_back(1);
    nums.push_back(1);
    nums.push_back(2);
    nums.push_back(2);
    vector<int>().swap(nums); //或者nums.swap(vector<int> ())

    3.总结


    由上可见,vector虽然是动态数组,但是本质上和数组没什么区别,频繁的销毁新建,效率很低,所以正确的做法是新建vector的时候初始化一个合适的大小(笑),
    回到了数组的老路上。不过之后可以动态变化还是很方便,而且还有很多好用的函数。vecotr是动态数组,顾名思义他可以动态的增加自己的长度。


    Vector系列内存布局分析
    https://www.leadroyal.cn/p/181/
    https://lunatic.blog.csdn.net/article/details/88556426

  • 相关阅读:
    刘瑜写给女儿的信:愿你慢慢长大
    Linux 程序编译过程的来龙去脉
    2018新版驾照驾照psd模板下载
    最新行驶证 驾照ps模板psd模板
    《我不是药神》票房超25亿 曝片段呈现群像式演技
    微信小程序打开手机浏览器访问置顶网页
    微信如何打开手机浏览器
    微信发一个网址打开后自动调用手机自带默认浏览器或提示选择浏览器打开如何实现?
    网页跳转微信关注页面
    网页跳转微信添加页面
  • 原文地址:https://www.cnblogs.com/7star/p/15305373.html
Copyright © 2011-2022 走看看