vector <string>在超出范围之后不会清除内存

我遇到了以下问题,我不确定我是错的还是它的一个非常奇怪的错误。 我填充了大量的string,并希望它在某个点被清除。 这是一个简单的例子

#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; } 

我的问题是,如果我监视内存使用“顶”,内存使用减less只是一个非常小的数额(我认为它可能是vector开销),但似乎没有释放。 怎么会? 我用“long long”testing了相同的场景,但是这里一切正常。

std :: vector引用指出,如果包含的值不是指针,则调用析构函数。 似乎不正确的string虽然…

我感谢每一个答案。

(为了方便:我用g ++ 4.7.2使用debian linux 64Bit)

编辑:感谢迄今为止的答案。

现在我已经用vagrind地块描述了堆的使用情况,(是的,实际上正如预期的那样)在适当的时候它得到了适当的释放。 但是,为什么我实际上看到一个巨大的整数使用的变化,而不是与string(也whithin顶部)?

我需要对此有一定的了解,因为我需要能够在特定的时间释放我的内存,用于multithreading的服务器应用程序,这可能会运行数周或更长时间,而不会重新启动。 我什么时候才知道C ++内存pipe理器决定把一些内存还给操作系统?

Solutions Collecting From Web of "vector <string>在超出范围之后不会清除内存"

这是一个特定的使用top命令,而不是std::vector 。 问题是由数据结构释放的内存不会被释放回操作系统,即top命令监视内存使用情况的级别。 OS给你程序的内存一直保存在你的程序中,直到C ++的内存管理器决定把内存释放回操作系统。

这是因为从操作系统分配内存相对昂贵,需要以相对较大的块来完成。 C ++运行时库的内存管理器从OS“批发”中获得内存,然后根据需要将其包装到程序的各个部分。

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

即使正确释放内存,标准库也不需要将内存释放回操作系统。

例如,当你第一次分配所有内存的时候,这个库会从操作系统中分配一堆虚拟内存地址空间(很可能与mmap(2) )并将其分配。 但是当你完成这个内存的时候,它会挂起到虚拟地址空间,假设你以后可能需要这个内存,所以它不会调用munmap(2)来取消虚拟地址空间的映射。

因此,即使所有的内存已经从你的程序的角度正确地释放,所有操作系统看到的是你分配了一堆虚拟内存,但从来没有释放它。 这就是为什么top(1)报告你的内存使用量不减少,但是没有什么值得关注的。 当你的程序再次需要内存的时候,它会从你已有的虚拟地址空间分配它,所以你不会看到你的内存使用量增加,直到所有的内存已经用完。

正如在其他答案中所述,内存仍然可用于您的进程,并且在程序退出之前不会被释放。 如果你想要一个分配器来做到这一点,你可以使用jemalloc检出,这可以释放它回到操作系统,是非常有用的可扩展的多线程应用程序,如Facebook,但任何有其他成本。