【发布时间】:2013-03-30 05:14:32
【问题描述】:
无法弄清楚发生了什么错误。
这是一个简单的代码
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 已分配,当它应该显示内存使用量激增然后释放所有内容时,对吗?即使将 sn-p 括在大括号 {...} 中以确保范围,我也看不到任何改进。一旦分配了内存,它似乎直到程序结束才释放。
怀疑与向量有关,我尝试了以下代码,但行为相同。
{
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 上。
【问题讨论】:
-
您正在创建两个 unique_ptr 数组并且只删除一个?
-
@yngum,不,即使在第二个代码 sn-p 中也会出现问题。 sn-ps 是独立运行的。第一个 sn-p 将一个空向量与当前向量交换。
-
第二个 sn-p 也为每个元素创建两个 unique_ptr
-
@yngum,哦。怎么会这样?你建议我怎么改?我只想检查许多 unique_ptrs。实际代码将有一个包含两个 unique_ptrs 的类,但该类有许多实例。
-
@sri - 这只是虚拟内存。在程序结束之前,运行时可能不关心将地址空间还给操作系统。物理内存仍然可供操作系统(和其他程序)使用。
标签: c++ unique-ptr