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

原文地址:https://www.cnblogs.com/7star/p/15305373.html