我在实现向量< list< size_t>> 时遇到了内存问题。这是代码:
struct structure{
vector< list<size_t> > Ar;
structure(int n){
Ar.reserve(n);
for(size_t i =0; (int) i< n;i++){
list<size_t> L;
Ar.push_back(L);
}
}
~structure(){
vector<list<size_t> >::iterator it = Ar.begin();
while(it < Ar.end()){
(*it).clear();
++it;
}
Ar.clear();
}
};
int main() {
for(size_t k = 0; k <100 ; k++){
structure test_s = structure(1000*(100 - k));
}
return 0;
}
随着时间的推移,分配给该程序的物理内存应该会减少,因为通过在构造函数中使用 100 - k 分配给 test_s 的内存越来越少。这不是我观察的!相反,物理内存在运行的一半左右增加!
由于我在一个占用大量内存的更大程序中使用此代码,所以这有点灾难!
有两个细节我觉得很奇怪:
首先,物理内存使用量没有逐步增加,即使对象的大小在 for 循环的每个阶段都在变化,而是在 for 循环的第 50 次迭代左右内存突然增加。这种情况在我每次跑步时都会发生(而且我已经做过很多次了!)。内存增加的迭代不是随机的!
其次,当我将静态 size_t(例如 10000)传递给结构(size_t)构造函数时,我不再遇到问题了。正如您可能猜到的,静态值对我的代码不是很有用,因为我需要能够动态分配结构对象的大小。
我在 macos 10.8.3 上使用 g++ 进行编译。我没有尝试在另一个平台上编译,因为我更愿意继续在我的 Mac 上工作。
我尝试过的所有内存管理工具(Apple Instruments 和 Valgrind)都不是特别有用。Valgrind 只返回对库的引用,而不是对程序本身的引用。
任何帮助将非常感激!!
干杯,普拉曼