vector的内存会不会泄露?
即使不泄露,怎么能缩小所占空间呢?
我们知道vector有个clear()方法?
原型:
~~~
#include <vector>
void clear();
~~~
函数clear()删除储存在vector中的所有元素. 如果vector的元素是一些object, 则它将为当前储存的每个元素调用它们各自的析构函数(destructor). 然而, 如果vector储存的是指向对象的指针, 此函数并不会调用到对应的析构函数. 在第二种情况下, 为了完全删除vector中的元素则应使用一个类似于下的循环:
~~~
std::vector<SomeObject*> aVector;
//The elements of the vector are created with the operand 'new' at some point in the program
[...]
for(int i=0 ; i<aVector.size() ; i++)
delete aVector[i];
aVector.clear();
~~~
调用clear之后, vector的尺寸(size)将变成zero. 但它的容量(capacity)却并不发生变化, vector本身并不释放任何内存.
如果你想同时做到清空vector的元素和释放vector的容量, 你可以使用swap技巧。
这样做会创建一个临时的空vector, 它将替换希望清空的vector。
**“vector 的 clear 不影响 capacity , 你应该 swap 一个空的 vector。”**
~~~
vector<type>(v).swap(v);
~~~
//对于string则可能像下面这样
string(s).swap(s);
即先创建一个临时拷贝与原先的vector一致,值得注意的是,此时的拷贝 其容量是尽可能小的符合所需数据的。紧接着将该拷贝与原先的vector v进行 交换。好了此时,执行交换后,临时变量会被销毁,内存得到释放。此时的v即为原先 的临时拷贝,而交换后的临时拷贝则为容量非常大的vector(不过已经被销毁)
为了证明这一点,我写了一个程序,如下:
~~~
#include <iostream>
#include <vector>
using namespace std;
vector <string> v;
char ch;
int main()
{
for (int i = 0; i<1000000; i++)
v.push_back("hello vector");
cin >> ch;
// 此时检查内存情况 占用54M
v.clear();
cin >> ch;
// 此时再次检查, 仍然占用54M
cout << "Vector 的 容量为" << v.capacity() << endl;
// 此时容量为 1048576
vector<string>(v).swap(v);
cout << "Vector 的 容量为" << v.capacity() << endl;
// 此时容量为0
cin >> ch;
// 检查内存,释放了 10M+ 即为数据内存
return 0;
}
~~~
- 前言
- deprecated关键字
- 指针(内存泄露)
- 头文件相互包含(Compiler error C2653: not a class or namespace name)
- 获取一张图片的width和height
- This function or variable may be unsafe.
- 智能指针陷阱
- string中的c_str()陷阱
- wstring与string的转换
- windows下chrome浏览器插件不能安装
- 重定义关键字
- 正确释放vector的内存
- 获取设备环境HDC
- 抽象类不能实例化对象(但是你明明定义的不是抽象类)
- 重载赋值运算符的自我赋值
- 程序中的变量未初始化
- 成对使用new和delete时要采取相同的形式
- 意想不到的除数为零
- map的初始化(插入数据)
- 正则表达式截取字符串
- 捕获窗口之外的鼠标消息(钩子还是??)
- 类中的静态成员变量(static or const static)
- 有if就要有else(一定成对)
- map查找结果处理
- 使用using namespace std的坏习惯
- new一个指针数组、以及创建动态二维数组
- 使用太多的全局变量
- 没有及时break出for循环
- vector使用erase后迭代器变成野指针
- C++函数的默认参数(重新定义默认参数)
- 0xC0000005: 读取位置 xxx时发生访问冲突
- std::string初始化、最快速判断字符串为空
- 你开发的软件安装在C盘Program Files (x86)下产生的异常