首页 > 解决方案 > 如何强制操作系统收回内存?(C++)

问题描述

在我的 C++ 代码中,我分配了大量内存来创建一棵树,然后在每个节点中使用“删除”来释放内存。

删除所有内容后,我检查操作系统使用的内存量,发现内存没有释放。这是意料之中的,因为该进程不会立即将内存返回给操作系统,因为它仍然可能再次使用它。

问题是我在删除第一棵树后立即创建了另一棵巨大的树,而不是使用已分配的内存,该进程从操作系统分配更多内存。正因为如此,我的内存用完了,我的电脑变得非常慢,甚至无法切换标签。我检查了几次内存使用情况,看看这是否真的发生了,确实如此。

如果我能让进程使用它之前使用的相同内存,或者如果我可以强制进程将内存还给操作系统就好了。

我能做些什么来解决这个问题?

(我正在使用 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++memory-management

解决方案


如何强制操作系统收回内存?(C++)

终止进程。

除此之外,可能有特定于操作系统的调用可以做到这一点,但尝试使用这些调用可能会干扰动态内存分配器实现,这可能依赖于控制它拥有的内存。

...而不是使用已经分配的内存,该进程从操作系统分配更多内存。

如果是这种情况,那么您的程序似乎可能存在内存泄漏,并且您实际上并没有删除所有内容。我建议确保没有泄漏。


当我认为问题是内存泄漏时,我在另一个主题中发布了代码。这是相同的代码。

代码是不完整的,无法确定完整的程序不会泄漏内存。

那时您以不同的方式描述了该案例,并且基于该描述,没有理由假设存在内存泄漏。


推荐阅读