gpt4 book ai didi

c++ - vector 超出范围后不清除内存

转载 作者:IT王子 更新时间:2023-10-29 00:45:40 25 4
gpt4 key购买 nike

我遇到了以下问题,我不确定是我错了还是真的很奇怪。我填充了大量的字符串,并希望在某个时候将其清除。这是一个最小的例子

#include <string>
#include <vector>
#include <unistd.h> //sleep
#include <iostream>

int main(){
{
std::vector<std::string> strvec;
for(long i = 0; i < 1000000; ++i){
std::string out = "This is gonna be a long string just to fill up the memory used by this fucking pthread\n";
strvec.push_back(out);
}
std::cout << "finished loading 1st\n";
sleep(10); // to monitor any changes
}
std::cout << "out of scope\n";
sleep(10);
return 0;
}

我的问题是,如果我使用“top”监视内存使用情况,内存使用量只会减少非常小的数量(我认为这可能是 vector 开销),但大部分似乎都没有释放。怎么会?我用“long long”测试了相同的场景,但这里一切正常。

std::vector 引用指出,如果包含的值不是指针,则调用析构函数。虽然对于字符串来说似乎不正确......

我感谢每一个答案。

(为方便起见:我正在使用带有 g++ 4.7.2 的 debian linux 64 位)

编辑:感谢您到目前为止的回答。

到现在为止,我已经分析了 vagrind massif 的堆使用情况,并且(是的,实际上正如预期的那样)它在它应该被释放的时候得到了正确的释放。但为什么我实际上看到一个巨大整数的用法发生了变化,但字符串(也在顶部)却没有?

我需要对此多加考虑,因为我需要能够在特定时间为多线程服务器应用程序释放内存,该应用程序可能会运行数周或更长时间而无需重新启动。我什么时候真正知道 C++ 内存管理器何时决定将一些内存返回给操作系统?

最佳答案

这是使用 top 命令的具体说明,而不是 std::vector 的说明。问题是数据结构释放的内存不会释放回操作系统,top 命令在该级别监视内存使用情况。操作系统为您的程序提供的内存将一直保留在您的程序中,直到 C++ 的内存管理器决定是时候将一些内存释放回操作系统。

这样做的原因是从操作系统分配内存是比较昂贵的,并且需要以比较大的 block 来完成。 C++运行时库的内存管理器从操作系统“批发”获取内存,然后根据需要将其分配给您的程序部分。

如果您想验证内存是否确实被回收,请使用一个工具来监控较低级别的内存使用情况,例如 valgrind .

关于c++ - vector<string> 超出范围后不清除内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17871970/

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