在我的树中,我有Node类,该类包含以下指向其子节点的向量:
std::vector<Node*> child;
该类的析构函数首先删除所有分配的变量,然后删除子树:
~Node() {
//Deletes all the allocated variables
.
.
.
//Deletes the subtrees
for(int i = 0; i < child.size(); i++) {
delete child[i];
}
}
Node类中有一个方法可以构建给定深度的树:
void createTree(int depth) {
if(depth == 0) {
return;
}
for(int i = 0; i < numberOfChildNodes; i++) {
child.push_back(new Node());
child[i]->createTree(depth - 1);
}
}
还有另一种方法,首先创建深度为3的树,然后将其删除,然后再创建深度为4的树,然后再创建5,直到达到内存限制:
void createMaximumTree() {
int i, depth = 3;
struct sysinfo memInfo;
while(true) {
createTree(depth);
sysinfo (&memInfo);
//Checking if the free memory available to the OS is lower than the limit
if(memInfo.freeram < limit) {
std::cout << "Maximum depth: " << depth;
break;
}
for(i = 0; i < child.size(); i++) {
delete child[i];
}
child.clear();
depth++;
}
for(i = 0; i < child.size(); i++) {
delete child[i];
}
child.clear();
}
如果我检查此过程的内存使用情况,则会发现即使在上述方法中删除树后,操作系统也不会恢复其内存。这是预料之中的,因为该进程不会在删除操作后立即释放内存,因为它可能仍会再次使用它。
问题是,如果我两次调用方法createMaximumTree(),则在删除第一棵树之后它不会将内存返回给操作系统,并且它会为第二棵树分配更多的内存,而不是使用此分配的内存,导致我的计算机内存不足。电脑太慢了,以至于我什至无法切换标签。这就是我检查内存的方式。
struct sysinfo memInfo;
sysinfo (&memInfo);
std::cout << memInfo.freeram;
createMaximumTree();
sysinfo (&memInfo);
std::cout << memInfo.freeram;
createMaximumTree();
sysinfo (&memInfo);
std::cout << memInfo.freeram;
这是内存管理器中的错误吗?我该怎么做才能解决此问题?
(我正在使用Debian)