在C ++中使用树时出现内存问题

时间:2020-05-20 19:24:27

标签: c++ memory-management

在我的树中,我有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)

0 个答案:

没有答案