C++ vector内存分配及正确释放

目录

内存分配

内存释放

1.清空vector的元素:clear()

2.释放内存:clear() + shrink_to_fit()

3.释放vector中多余的空间或释放整个vector空间:swap()


内存分配

1.C++ vector:相当于一个动态数组,它的内存会随着size的增加而不断的增长。


2.内存分配的两个函数

2.1.size()返回实际占用内存的个数

2.2.capacity(),返回实际申请的空间大小,一般来说,capacity >= size 。

3.扩容:当capacity和size相等时,vector就会扩容,capacity会成倍增长。个人验证扩容后vector占内存为原来的2倍,但有人说扩容后是原来内存的1.5倍,可能与系统相关。

4.扩容原理:以vector最常用的push_back为例,调用push_back时,若当前容量(capacity)已经不能够容纳新的元素,即此时capacity=size,那么vector会重新申请一块内存,把之前的内存里的元素拷贝到新的内存当中,然后把push_back的元素拷贝到新的内存中,最后要析构原有的vector并释放原有的内存。这个过程的效率是极低的,为了避免频繁的分配内存,C++每次申请内存一般都会成倍的增长,例如之前是4,那么重新申请后就是8,以此类推。

5.扩容隐患:由于每次内存分配成倍数申请,可能引发内存分配不足抛出bad_alloc异常,推荐以下的解决方案:如何在C++中处理bad_alloc? | 经验摘录。

3.扩容验证代码:

#include 
#include 
using namespace std;

int  main(){
vector vec(10);
cout << "vec.size: "<< vec.size() <

运行结果如图:

C++ vector内存分配及正确释放_第1张图片

内存释放

1.清空vector的元素:clear()

使用clear()不会真正释放内存,capacity()无变化

#include 
#include 
using namespace std;

int main(){
	vector vec;
	//手动空间100 
	vec.reserve(100);
	vec.push_back(1);
	vec.push_back(2);
	cout <<"vec.size(): " << vec.size() << endl;
	cout <<"vec.capasity(): " << vec.capacity() << endl;
	vec.clear();
	cout <<"After vec.size(): " << vec.size() << endl;
	cout <<" After vec.capasity(): " << vec.capacity() << endl;
	
	return 0;
}  

运行结果如图:

C++ vector内存分配及正确释放_第2张图片

2.释放内存:clear() + shrink_to_fit()

想要彻底释放内存,C11引入了shrink_to_fit();,在执行完clear()后执行,可完全释放内存

#include 
#include 
using namespace std;

int main(){
	vector vec;
	//手动空间100 
	vec.reserve(100);
	vec.push_back(1);
	vec.push_back(2);
	cout <<"vec.size(): " << vec.size() << endl;
	cout <<"vec.capasity(): " << vec.capacity() << endl;
	vec.clear();
	vec.shrink_to_fit();
	cout <<"After vec.size(): " << vec.size() << endl;
	cout <<"After vec.capasity(): " << vec.capacity() << endl;
	
	return 0;
}  

运行结果如图:

C++ vector内存分配及正确释放_第3张图片

3.释放vector中多余的空间或释放整个vector空间:swap()

1.swap的用法有以下两种:

1.释放vector中多余的空间

2.释放整个vector空间

构造函数也不同:

释放整个vecter空间:vector ().swap(vec);

释放vec中多余空间:vector (vec).swap(vec);

2.swap交换技巧释放内存空间的思想:vector()使用默认构造函数建立临时vector对象,再对该临时对象上调用swap()成员,swap调用之后对象vector占用的空间就等于一个默认构造的对象的大小,临时对象就具有原来对象vector的大小,而临时对象随机被析构,从而其占用的空间被释放调。

例:vector释放全部占用内存

#include 
#include 
using namespace std;

int main(){
	vector vec;
	//手动空间100 
	vec.reserve(100);
	vec.push_back(1);
	vec.push_back(2);
	cout <<"vec.size(): " << vec.size() << endl;
	cout <<"vec.capasity(): " << vec.capacity() << endl;
	vector ().swap(vec);
	cout <<"After vec.size(): " << vec.size() << endl;
	cout <<"After vec.capasity(): " << vec.capacity() << endl;
	
	return 0;
}  

运行结果如图:

C++ vector内存分配及正确释放_第4张图片

你可能感兴趣的:(STL,c++)