(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)



