无法弄清楚发生了什么错误。
这是一个简单的代码
size_t n_elem = 30000000; //careful! will allocate 1GB with unique_ptr
vector<unique_ptr<double> > tmp;
tmp.resize(n_elem);
for(size_t i=0; i<n_elem; i++){
tmp[i] = unique_ptr<double>(new double((double)i));
}
tmp.clear();
//Some answers in Stack overflow seems to suggest this technique to force
//freeing, but does not seem to work.
vector<unique_ptr<double> > tmp1;
tmp.swap(tmp1);
当这完成时。系统监视器仍然显示 948 MB 已分配,但它应该显示内存使用量激增然后释放所有内容,对吗?即使片段包含在大括号 {...} 中以确保范围,我也看不到任何改进。一旦分配了内存,它似乎直到程序结束才释放。
怀疑带有矢量的东西,我尝试了下面的代码,但行为相同。
{
size_t n_elem = 30000000;
unique_ptr<double>* tmp = new unique_ptr<double>[n_elem];
for(size_t i=0; i<n_elem; i++)
tmp[i] = unique_ptr<double>(new double((double)i));
delete[] tmp;
}
然而,
size_t n_elem = 30000000;
double *d_tmp;
d_tmp = new double[n_elem];
for(size_t i=0; i<n_elem; i++)
{
d_tmp[i] = (double)i;
}
delete[] d_tmp;
此代码显示内存使用量上升到大约 260 MB,然后随着数组被删除而减少。
我尝试使用类而不是双精度类,并计算使用静态变量调用析构函数的次数。在这两种情况下,析构函数都被调用了正确的次数。
我无法弄清楚我使用 unique_ptr 的方式出了什么问题,以及为什么它在销毁后没有返回分配给操作系统的内存。cpp 参考似乎表明这应该在 uniue_ptrs 被破坏时自动发生。如何让 unique_ptr 释放它分配的内存并将其返回给操作系统?
这发生在带有 ubuntu 12.04 和 qtcreator qt 项目的 gcc 4.6 上。