在我的C ++代码中,我分配了大量的内存来创建树,然后在每个节点中使用'delete'释放内存。
删除所有内容后,我检查了操作系统使用的内存量,发现内存没有释放。这是预料之中的,因为该进程不会立即将内存返回给操作系统,因为它仍可能会再次使用它。
问题是,我删除第一棵树后立即创建了另一棵大树,该进程从操作系统中分配了更多的内存,而不是使用已经分配的内存。因此,我内存不足,计算机运行速度非常缓慢,甚至无法切换选项卡。我过了一会儿检查了内存的使用情况,看是否确实是这种情况。
[仅当我可以使该进程使用与以前相同的内存时,或者如果我可以强制该进程将内存返还给OS。
如何解决此问题?
((我正在使用Debian)
我正在创建动态对象树。 Node类具有一个用于存储子节点的向量,以及其他类变量:
std :: vector子;类析构函数删除所有动态分配的类变量,然后删除子节点:
~Node() {
//Deleting the other variables
.
.
.
//Deleting the child nodes
for(int i = 0; i < child.size(); i++) {
delete child[i];
}
}
我的班级有一个创建给定高度的树的方法,其中当前节点为根节点:
void createTree(int height) {
if(height == 0) {
return;
}
for(int i = 0; i < numberOfChildNodes; i++) {
child.push_back(new Node());
child[i]->createTree(height - 1);
}
}
此类有另一种方法,我创建一棵树的高度为3,然后删除整棵树,并创建另一棵树,其高度为4,然后删除整棵树,然后创建高度为5的树,依此类推,直到达到内存限制:
void highestTreePossible() {
int i, height = 3;
struct sysinfo memInfo;
while(true) {
createTree(height);
sysinfo (&memInfo);
if(memInfo.freeram > limit) {
std::cout << "Highest tree possible: height = " << height;
break;
}
for(i = 0; i < child.size(); i++) {
delete child[i];
}
child.clear();
height++;
}
for(i = 0; i < child.size(); i++) {
delete child[i];
}
child.clear();
}
如何强制操作系统要求退回内存? (C ++)
终止过程。
除此之外,可能会有特定于操作系统的调用可以执行此操作,但是尝试使用那些调用可能会干扰动态内存分配器的实现,而后者可能依赖于控制其拥有的内存。
...,而不是使用已经分配的内存,该进程从操作系统分配更多的内存。
如果是这种情况,则似乎您的程序可能存在内存泄漏,实际上您并未删除所有内容。我建议确保没有泄漏。
我在另一个主题中发布了代码,当时我以为问题是内存泄漏。这是相同的代码。
代码不完整,无法确切地说出完整的程序不会泄漏内存。
然后,您以不同的方式描述了这种情况,并且基于该描述,没有理由假定存在内存泄漏。