栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

std::vector内存清理

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

std::vector内存清理

(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自动析构的时候。
这时候我们就需要对它进行特殊处理了。

vector的内存清理方式:一种是借助内存析构函数,一种是借助从c++11开始提供的新方法shrink_to_fit()来完成清理。
std::vector array;

借助shrink_to_fit方法
方式一:借助shrink_to_fit到size=0来完成释放
array.clear();
array.shrink_to_fit();

借助析构函数实现的方法有两种
方式一:借助swap到内容到临时变量完成析构
array.swap(std::vector());

方式二:借助重新构造赋值来做内存析构
array = std::vector();

shrink_to_fit实现参考:

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

void _Tidy()
{// free all storage
  this->_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();
  }
}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869050.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号