(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
参考:https://stackoverflow.com/questions/13944886/is-stdvector-memory-freed-upon-a-clear

引言

vector的堆内存申请大小取决于它的capacity大小,并不取决于size大小;并且capacity总是大于等于size;

例如,一个vector加入很多内容后,如果clear,size将会变成0,但capacity还是那么多,并不会减少。

vector析构的时候,才会把申请的堆内存释放掉。

~vector() noexcept
{// destroy the object_Tidy();
}

但有时,我们希望早点清理掉它,而不是等到vector析构的时候。

这时候我们就需要对它进行特殊处理了,使其能早些调用_Tidy()清理掉申请内存。

找到下面几种方式。

内存清理方法

vector的内存清理方式:
一种是借助从c++11开始提供的新方法shrink_to_fit()来清理;
一种是借助临时变量的析构函数;
一种是借助于=操作符重载实现,对内容重新构造时释放原内存;
一种是借助析构函数可重入性,主动调用;

std::vector<int> array;

方式一:
借助shrink_to_fit到size=0来完成释放

array.clear();
array.shrink_to_fit();

方式二:
借助数据swap转换到临时变量,临时变量析构,释放内存。
方式三:
借助右值传递到临时变量,临时变量析构,释放内存。

std::vector<int>().swap(array);
std::vector<int>(std::move(array));

方式四:
借助=操作符重新构造内容来促使原内容清理

array = std::vector<int>();

方式五:
(通常不推荐)借助vector析构函数的可重入性,主动调用析构,这样的话加上编译器生成的析构调用有两次,这就借助了析构的代码可重入特点。

array.std::vector<int>::~vector();

引用函数参考

_Tidy函数参考:

void _Tidy()
{// free all storagethis->_Orphan_all();if (this->_Myfirst() != pointer()){  // destroy and deallocate old array_Destroy(this->_Myfirst(), this->_Mylast());this->_Getal().deallocate(this->_Myfirst(), capacity());this->_Myfirst() = pointer();this->_Mylast() = pointer();this->_Myend() = pointer();}
}

shrink_to_fit实现参考:

void shrink_to_fit()
{// reduce capacity to size, provide strong guaranteeif (_Has_unused_capacity()){   // something to doif (empty()){_Tidy();}else{_Reallocate_exactly(size());}}

操作符=重载实现参考:

vector& operator=(vector&& _Right) _NOEXCEPT_COND(_Always_equal_after_move<_Alty>)
{// assign by moving _Rightif (this != _STD addressof(_Right)){  // different, assign itif (_Always_equal_after_move<_Alty> || this->_Getal() == _Right._Getal()){  // will steal _Right's contents (also, POCMA non-equal must reload array)_Tidy();}this->_Move_alloc(_Right._Getal());_Move_assign_from(_STD move(_Right), bool_constant<_Always_equal_after_move<_Alty>>{});}return (*this);
}
vector& operator=(const vector& _Right)
{// assign _Rightif (this != _STD addressof(_Right)){// different, assign itif (_Alty_traits::propagate_on_container_copy_assignment::value  && this->_Getal() != _Right._Getal()){// reload array_Tidy();}this->_Copy_alloc(_Right._Getal());assign(_Right._Myfirst(), _Right._Mylast());}return (*this);
}

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

std::vector内存清理相关推荐

  1. 逐步释放质疑怎么样释放std::vector所占用的内存空间

    我只听见硬盘 嘎吱嘎吱地响,Window 98已累患上对键盘.鼠标一无反映 总的说来,C/C++的内存办理照旧太庞大了,步伐员忙这些个工作就够了,没法搞出Java同样更"高级"的庞 ...

  2. std::vector删除元素迭代器以及内存的变化

    std::vector是顺序容器,当用erase成员函数删除一个迭代器指向的元素时,会自动移动(不是std::move)后面的元素到前面来,而迭代器的指向不变(如果是std::map.std::lis ...

  3. c++ vector查找_C++ vector内存分配策略浅析

    (给CPP开发者加星标,提升C/C++技能) 来源:邱国禄https://blog.csdn.net/qiuguolu1108/article/details/107146184 vector是一个封 ...

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

    原文出处:http://blog.csdn.net/qq_30835655/article/details/60762196 最近开始更加深入的学习C++,发现了很多以前没注意到但是很重要的知识点.这 ...

  5. vector内存分配和回收机制

    随着对C++的深入学习,逐渐发现了一些很重要的知识点.本文重点讲解C++ Vector内存机制和效率问题. iOS移动端 记得之前做iOS移动端时,关于垃圾回收机制是这样说的: ARC的基本概念:   ...

  6. [转载] C++ std::vector指定位置插入

    参考链接: C++ : Vector删除所有指定的元素 使用vector,必须加上:#include <vector> 1.初始化vector,一般有这几种方式: std::vector& ...

  7. std::vector介绍

    文章来源:http://blog.csdn.net/willoj/article/details/2252543 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算 ...

  8. c++的*号是否有空格的区别以及char*转std::vector<float>解析

    文章目录 一.前言 二.正文 1.*带不带空格的区别 2.char*和char** 3.关于指针运算 4.char指针转std::vector<float> 解析 (1)const cha ...

  9. vector内存机制和性能分析

    原文出处:http://blog.csdn.net/mfcing/article/details/8746256  不用版本的stl库,动态增长的倍数可能不同,具体进源码里面就一目了然(stl里面的源 ...

  10. STL之容器Vector内存管理

    大家都知道,STL中的vector容器的数据安排(线性空间或者叫块内存)及操作方式(支持随机访问),与array(数组)非常相似,唯一的差别在于前者为动态空间,随着元素的增加,内部机制会自动扩大空间而 ...

最新文章

  1. mysql生成随机验证码_MySQL 生成随机数字、字符串、日期、验证码及 UUID的方法...
  2. currency abap_Java Currency getDefaultFractionDigits()方法及示例
  3. JDBC——实现通用的查询
  4. 查看 Linux 中文件打开情况
  5. 韩国大面积断网事情,可能遭受了DDoS攻击,网友:真的是黑客攻击吗?
  6. java cookie详解
  7. HDU-2510(深搜)
  8. Mybatis教程-实战
  9. 最棒的PHP后台管理系统
  10. IDEA 顶部导航栏(Main Menu)不见了怎么办
  11. 推荐一下比较好用的清理垃圾的方法和软件
  12. 强烈推荐纪录片——《互联网之子》
  13. mybatis动态指定表名注意点
  14. 生成淘宝短链tb.cn
  15. 大数据思维导图锦集(原创吐血整理,不定期更新)
  16. R语言与LASSO回归和LAR算法
  17. 天猫精灵连接蓝牙摸索4 STM32单片机和TG7100B实现数据上发和播报
  18. 类的成员变量 请定义一个交通工具(Vehicle)的类其中有: 属性速度(speed)体积(size)等等 方法移动(move())设置速度(setSpeed(int speed))加速speed
  19. QQ宠物智能辅助开发
  20. TCP吞吐量的理论计算公式

热门文章

  1. [GRE] 填空机经 Section61-65
  2. EasyRecovery2022强力数据恢复软件
  3. 微信小程序----评价系统中的评星
  4. CTF中的RSA套路
  5. 用gambit学博弈论---零和博弈
  6. Android开发-Android项目结构
  7. PHP/PHPStudy所需的VC9-VC14的运行库
  8. 免费 web api 接口大全
  9. vbb bbcode
  10. RTI_DDS自定义插件开发 6 方法