gpt4 book ai didi

c++ - 如何确保 std::vector 分配的内存在解除分配后返回给操作系统?

转载 作者:行者123 更新时间:2023-11-28 02:36:53 25 4
gpt4 key购买 nike

下面的代码正在调用 foo 并使用 while(1) 来观察内存使用情况。据我所知,在打印“完成”后,var d 被释放,STL 容器将自行释放数据空间(堆)。

#include <vector>
#include <string>
#include <iostream>

void foo() {
std::vector<std::string> d(100000000);
for(int i = 0; i < 100000000; ++i) d[i] = "1,1,3";
d.resize(0);
d.shrink_to_fit();
}

int main(int argc, char *argv[])
{
foo();
std::cout << "finished" << std::endl;
while(1) {;}
return 0;
}

但我观察到的(使用 htop):内存没有释放回操作系统。这只是一个工作台和与 MESOS 相关的真实代码,每个进程都有内存限制。

我在使用 glibc 2.15 的 linux 服务器上尝试了几个版本的编译器,例如 g++-4.7.2 g++-4.8.1、clang++。此外,我还使用了 tcmalloc 而不是默认的 malloc,但它仍然不起作用(在 MAC 机器上不会发生该问题)。

有什么问题?我怎样才能确保内存返回给操作系统?谢谢。

最佳答案

How can I make sure the memory give back to os?

您可以终止您的进程。

What's the problem?

可能没有。程序不返回内存是正常的(尽管 Linux 确实会为一些特别大的分配提前返回内存)。他们通常使用 sbrk 或等价物来增加他们可用的虚拟地址空间,但通常不值得尝试返回已释放的内存。这可能是违反直觉的,但它也被证明在几十年的数百万个程序中是可行的,所以除非你有具体的切实问题,否则你不应该为它烦恼。它不应该给你带来问题,因为当应用程序执行进一步分配时,释放的内存将被重用,所以你提到的“每个进程的 MESOS 内存限制”仍然以相同的方式影响最大瞬时内存使用的“高水位线”。

请注意带有 virtual memory 的操作系统支持可能会将长时间未使用的已释放页面交换到磁盘,以便内核或其他应用程序重用后备 RAM

也可以使用例如手动控制。内存映射文件,但是编写这样的分配器并使用标准容器是一项非常重要的工作......关于如何解决该问题的许多其他 SO 问题。

关于c++ - 如何确保 std::vector 分配的内存在解除分配后返回给操作系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27140658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com