11.Vector如何释放空间?
11.Vector如何释放空间?
由于vector的内存占用空间只增不减,比如你首先分配了10000个字节,然后erase掉后面9999个,留下一个有效元素,但是内存占用仍为10000个。所有内存空间是在vector析构时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以清空所有元素。但是即使clear(),vector所占用的内存空间依然如故,无法保证内存的回收。
如果需要空间动态缩小,可以考虑使用deque。
如果使用vector,可以用swap()来帮助你释放多余内存或者清空全部内存。
vector(Vec).swap(Vec); //将Vec中多余内存清除;
vector().swap(Vec); //清空Vec的全部内存;
当使用vector(Vec).swap(Vec)
这样的语句时,它实际上执行了以下步骤:
-
创建临时
vector
对象:vector(Vec)
会创建一个临时的vector
对象,其中的元素是拷贝自Vec
的元素,但临时vector
并不会预留多余的内存空间。也就是说,临时vector
的容量(capacity)与实际存储的元素个数(size)相同,没有多余的内存空间。 -
swap
函数交换内容:Vec
和临时vector
的内容进行了交换,也就是它们的指针和容量等信息进行了交换。这个交换是非常高效的,因为swap
只交换了指针,而没有真正移动元素。 -
临时
vector
析构:在整个语句执行完毕后,临时vector
对象会被立即析构,因为它是在这个语句的作用域中创建的。在析构时,临时vector
会释放它所持有的内存空间。由于临时vector
的容量和实际存储的元素个数相同,所以这里释放的就是Vec
之前的多余内存。
让我们通过一个例子来说明这个过程:
#include <vector>
#include <iostream>
int main()
{
std::vector<int> Vec;
for (int i = 1; i <= 10; ++i)
{
Vec.push_back(i); // 添加元素1-10到Vec
}
std::cout << "Vec Size: " << Vec.size() << ", Capacity: " << Vec.capacity() << std::endl; // 输出 Size: 10, Capacity: 16
// 使用 vector(Vec).swap(Vec) 释放多余内存
std::vector<int>(Vec).swap(Vec);
std::cout << "Vec Size: " << Vec.size() << ", Capacity: " << Vec.capacity() << std::endl; // 输出 Size: 10, Capacity: 10
return 0;
}
在这个例子中,一开始Vec
的容量是16(这是一个比实际存储元素个数大的值,用于提高效率)。通过vector(Vec).swap(Vec)
语句后,Vec
的容量变为10,说明多余的内存被成功释放了。
在vector().swap(Vec);
语句中,vector()
创建了一个空的临时vector
对象,然后通过swap
函数将Vec
和这个临时vector
的内容进行交换。结果Vec
变为空,同时释放了所有之前的内存。
需要注意的是,这两种方法只能释放vector
多余的内存,而不能释放vector
中元素本身可能占用的动态分配的内存。例如,如果vector
中存储的是指向动态分配对象的指针,那么这些动态分配的对象的内存需要单独释放。
实例
#include <iostream>
#include <vector>
using namespace std;
int main ()
{
vector<int> vec (100,100); // three ints with a value of 100
vec.push_back(1);
vec.push_back(2);
cout <<"vec.size(): " << vec.size() << endl;
cout <<"vec.capacity(): " << vec.capacity() << endl;
vector<int>(vec).swap(vec); //清空vec中多余的空间,相当于vec.shrink_to_fit();
cout <<"vec.size(): " << vec.size() << endl;
cout <<"vec.capacity(): " << vec.capacity() << endl;
vector<int>().swap(vec); //清空vec的全部空间
cout <<"vec.size(): " << vec.size() << endl;
cout <<"vec.capacity(): " << vec.capacity() << endl;
return 0;
}
输出:
运行结果:
vec.size(): 102
vec.capasity(): 200
vec.size(): 102
vec.capasity(): 102
vec.size(): 0
vec.capasity(): 0