在我的 C++ 代码中,我分配了大量内存来创建树,然后在每个节点中使用“删除”来释放内存。
删除所有内容后,我检查操作系统使用的内存量,发现内存未释放。这是预期的,因为该进程不会立即将内存返回给操作系统,因为它仍然可能会再次使用它。
问题是,我在删除第一个树后立即创建了另一个巨大的树,并且该进程没有使用已分配的内存,而是从操作系统分配了更多内存。因此,我的内存耗尽了,我的电脑变得非常慢,甚至无法切换选项卡。我多次检查了内存使用情况,看看这是否真的发生了,事实确实如此。
如果我能让进程使用以前使用过的相同内存,或者如果我可以强制进程将内存返回给操作系统就好了。
我可以做什么来解决这个问题?
(我使用的是Debian)
我正在创建一棵动态对象树。 Node 类有一个向量来存储子节点以及其他类变量:
std::向量子;
类析构函数删除所有动态分配的类变量,然后删除子节点:
~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();
}