文章目录
- 1. 使用`clear`函数(清除不了)
- 2. 结合`swap`技巧来释放内存
- 3. 利用`shrink_to_fit`函数(C++11及之后版本可用)
在C++的STL中,
vector
有几种方式可以在一定程度上管理和释放内存,以下为你详细介绍:
1. 使用clear
函数(清除不了)
clear
函数主要用于清除vector
容器中的所有元素,它会将容器的大小变为0,但并不一定会立即释放所占用的内存空间给操作系统。
clear 的源码解析 链接
示例代码如下:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> myVector = {1, 2, 3, 4, 5};
myVector.clear();
// 此时容器大小变为0,但内存可能还未释放回操作系统
std::cout << "Size after clear: " << myVector.size()<<"capicity" <<myVector.capicity()<< std::endl;
return 0;
}
2. 结合swap
技巧来释放内存
如果想要真正释放vector
所占用的内存,可以通过swap
的技巧来实现。其原理是创建一个临时的空vector
,然后与原vector
进行交换,这样原vector
所占用的内存就会被释放(因为临时的空vector
在其作用域结束后会自动析构并释放内存),而原vector
得到的是临时空vector
的较小内存空间。
示例代码如下:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> myVector = {1, 2, 3, 4, 5};
std::vector<int>().swap(myVector);
// 经过这一步,myVector的内存大概率已释放回操作系统
std::cout << "Size after swap: " << myVector.size() << std::endl;
return 0;
}
3. 利用shrink_to_fit
函数(C++11及之后版本可用)
shrink_to_fit
函数可以请求容器减少其容量以适应其当前的大小。不过需要注意的是,这只是一个请求,标准库并不保证一定会释放多余的内存,具体是否释放取决于标准库的实现。其实底层还是调用了swap
示例代码如下:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> myVector = {1, 2, 3, 4, 5};
myVector.clear();
myVector.shrink_to_fit();
// 尝试让vector释放多余的内存,实际释放情况依标准库实现而定
std::cout << "Size after shrink_to_fit: " << myVector.size() << std::endl;
return 0;
}
通常来说,使用swap
技巧相对更能确保内存被释放回操作系统,而clear
和shrink_to_fit
在不同的应用场景和标准库实现下效果可能会有所差异。