【发布时间】:2013-06-19 13:41:45
【问题描述】:
我在实现向量> 时遇到了内存问题。代码如下:
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)传递给 structure(size_t) 构造函数时,我不再遇到问题了。您可能已经猜到,静态值对我的代码不是很有用,因为我需要能够动态分配结构对象的大小。
我在 macOS 10.8.3 上使用 g++ 进行编译。我没有尝试在另一个平台上编译,因为我更愿意继续在我的 Mac 上工作。
我尝试过的所有内存管理工具(Apple Instruments 和 Valgrind)都不是特别有用。 Valgrind 只返回对库的引用,而不是对程序本身的引用。
任何帮助将不胜感激!
干杯, 普拉门
【问题讨论】:
-
你的析构函数什么都不做,你的构造函数可以写成
structure(int n) : Ar(n) {}。这里没有内存泄漏。 -
零规则。你的类不需要析构函数。我什至懒得去检查它是否是原因。
-
您是如何发现您的程序存在内存泄漏的?您知道您的程序不必(立即)将内存返回给操作系统吗?
-
我在活动监视器中观察到内存增加。这是错的吗?感谢有关构造函数和析构函数的提示。我很确定这些不是原因;如果我将文字传递给构造函数,则不会出现问题。
标签: c++ list memory vector stl