【发布时间】:2011-06-29 20:40:33
【问题描述】:
我想做的是释放vector(比如vector<vector<int>>)使用的内存,我使用了交换技巧,即v.swap(vector<vector<int>>())。
但是,我观察到交换技巧对短向量很有效,但不适用于长向量,例如我尝试了一个长度为 10,000,000 的向量,它占用了 1.4G 内存,交换后仍有 1.0G 未释放.
下面是我用来测试的代码。
提前感谢您的任何想法!
#include <iostream>
#include <vector>
using namespace std;
typedef unsigned long long int64;
int main()
{
{
vector<vector<int64>> batch;
{
vector<int64> v;
for (size_t i = 0; i < 12; ++i)
v.push_back(8000000000);
for (size_t i = 0; i < 10000000; ++i)
batch.push_back(v);
}
cout << "pause 1" << endl;
cin.ignore();
{
vector<vector<int64>> tmp;
batch.swap(tmp);
// I tried several things here.
//tmp.swap(batch);
//batch.clear();
//batch.shrink_to_fit();
//batch = tmp;
}
cout << "pause 2" << endl;
cin.ignore();
}
cout << "pause 3" << endl;
cin.ignore();
}
【问题讨论】:
-
您如何测量“内存使用情况”?在程序中释放内存并不一定意味着运行时会将内存返回给操作系统(或者操作系统会回收它)。
-
操作系统可能会缓存您的内存分配。内存分配很昂贵,因此操作系统可能会“认为”由于您的程序将重复分配大量内存,因此不会将它们标记为空闲。
-
哪个操作系统?哪个编译器?操作系统(以及编译器、运行时......)通常对大内存分配有不同的内存分配规则。
-
我在Ubuntu 10.04中使用G++4.6,我使用的内存使用度量是“top”中显示的数字。
-
如果是因为操作系统做了缓存,是否可以禁用缓存?
标签: c++ stl vector memory-management