【问题标题】:How to force OS to claim back memory? (C++)如何强制操作系统收回内存? (C++)
【发布时间】:2020-05-19 18:12:59
【问题描述】:

在我的 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();
}

【问题讨论】:

  • 请发布您的程序/问题的minimal reproducible example
  • @JesperJuhl 我在另一个主题中发布了代码,当时我认为问题是内存泄漏。这是相同的代码。 stackoverflow.com/questions/61892960/…
  • 如果I couldn't even switch tabs 那么另一个问题的结论是错误的,你实际上是在泄漏。发布一个最小的复制示例,或者更好的是,使用unique_ptr 确保您没有泄漏。
  • @MrPontes 所有 Stackoverflow 问题都应该是自包含的。如果这是与 this 问题相关的代码,它应该是 in 这个问题。
  • 一个最小的可重现示例意味着某人可以获取代码并自己运行它并重现问题。您的程序中的其他地方可能存在内存泄漏。

标签: c++ memory-management


【解决方案1】:

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

终止进程。

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

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

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


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

代码不完整,无法断定整个程序没有泄漏内存。

当时你对这个案例的描述不同,根据那个描述,没有理由假设存在内存泄漏。

【讨论】:

    猜你喜欢
    • 2015-03-12
    • 1970-01-01
    • 2015-05-03
    • 2011-02-19
    • 1970-01-01
    • 2013-02-09
    • 2012-04-16
    • 2012-08-16
    相关资源
    最近更新 更多