我遇到了以下问题,我不确定我是否错了或者它是一个非常奇怪的错误。我填充了一个巨大的字符串数组,并希望在某个点将其清除。这是一个最小的例子
#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”监视内存使用情况,内存使用量只会减少很小的量(我认为这可能是向量开销),但大部分内存似乎没有释放。怎么会?我用“long long”测试了相同的场景,但这里一切正常。
std::vector 引用指出,如果包含的值不是指针,则调用析构函数。但对于字符串来说似乎并不正确......
我很感激每一个答案。
(为了方便起见:我使用 debian linux 64Bit 和 g++ 4.7.2)
编辑:感谢迄今为止的回答。
到目前为止,我已经分析了 vagrind Massif 的堆使用情况,并且(是的,实际上正如预期的那样)它在应该的时候得到了正确的释放。但为什么我实际上看到了一个大整数的使用变化,而不是字符串(也在顶部)的变化?
我需要对此进行一些考虑,因为我需要能够在某些时候为多线程服务器应用程序释放内存,该应用程序可能会运行几周或更长时间而不重新启动。我什么时候真正知道 C++ 内存管理器何时决定将一些内存返回给操作系统?
这是使用的具体top
命令,不属于std::vector
。问题是数据结构释放的内存不会释放回操作系统,即操作系统释放的内存级别。top
命令监视内存使用情况。操作系统为您的程序提供的内存将保留在您的程序中,直到 C++ 的内存管理器决定将一些内存释放回操作系统为止。
原因是从操作系统分配内存相对昂贵,并且需要以相对较大的块来完成。 C++ 运行时库的内存管理器从操作系统“批发”获取内存,然后根据需要将其分配到程序的各个部分。
如果您想验证内存是否确实被回收,请使用在较低级别监视内存使用情况的工具,例如valgrind http://valgrind.org/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)