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

问题描述 投票:0回答:1

在我的C ++代码中,我分配了大量的内存来创建树,然后在每个节点中使用'delete'释放内存。

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

问题是,我删除第一棵树后立即创建了另一棵大树,该进程从操作系统中分配了更多的内存,而不是使用已经分配的内存。因此,我内存不足,计算机运行速度非常缓慢,甚至无法切换选项卡。我过了一会儿检查了内存的使用情况,看是否确实是这种情况。

[仅当我可以使该进程使用与以前相同的内存时,或者如果我可以强制该进程将内存返还给OS。

如何解决此问题?

((我正在使用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
1个回答
3
投票

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

终止过程。

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

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

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


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

代码不完整,无法确切地说出完整的程序不会泄漏内存。

然后,您以不同的方式描述了这种情况,并且基于该描述,没有理由假定存在内存泄漏。

© www.soinside.com 2019 - 2024. All rights reserved.