c++ - 如何强制操作系统收回内存?(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++)
终止进程。
除此之外,可能有特定于操作系统的调用可以做到这一点,但尝试使用这些调用可能会干扰动态内存分配器实现,这可能依赖于控制它拥有的内存。
...而不是使用已经分配的内存,该进程从操作系统分配更多内存。
如果是这种情况,那么您的程序似乎可能存在内存泄漏,并且您实际上并没有删除所有内容。我建议确保没有泄漏。
当我认为问题是内存泄漏时,我在另一个主题中发布了代码。这是相同的代码。
代码是不完整的,无法确定完整的程序不会泄漏内存。
那时您以不同的方式描述了该案例,并且基于该描述,没有理由假设存在内存泄漏。
推荐阅读
- r - 在R中提取部分URL
- fortran - 我怎样才能使这个 Fortran OpenMP 减少工作?
- vb.net - 后台任务表单未按预期工作并冻结 GUI
- html - 跨度 ico 在 css
- angular - 多级问答树Angular 6反应形式
- azure - Azure ARM 部署 - TemplateLink 不是现有的语言表达式属性
- docker - docker 上的 pm2 卡在 getMonitorData
- docker-compose - Docker Compose 中的“环境:&environment”是什么意思?
- java - 为什么我不能“修改”其他类的字符串数组?
- spring - 如何为跨线程共享的 1000 个不同查询制作preparedstatement?