Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向量<;字符串>;超出范围后不清除内存_C++_Linux_String_Memory_Vector - Fatal编程技术网

C++ 向量<;字符串>;超出范围后不清除内存

C++ 向量<;字符串>;超出范围后不清除内存,c++,linux,string,memory,vector,C++,Linux,String,Memory,Vector,我遇到了以下问题,我不确定是我错了还是这是一个非常奇怪的错误。我填充了一个巨大的字符串数组,并希望它在某个点被清除。这里有一个最小的例子 #include <string> #include <vector> #include <unistd.h> //sleep #include <iostream> int main(){ { std::vector<std::string> strvec;

我遇到了以下问题,我不确定是我错了还是这是一个非常奇怪的错误。我填充了一个巨大的字符串数组,并希望它在某个点被清除。这里有一个最小的例子

#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;
}
#包括
#包括
#包括//睡眠
#包括
int main(){
{
std::向量strvec;
对于(长i=0;i<1000000;++i){
std::string out=“这将是一个长字符串,用于填充这个该死的pthread使用的内存\n”;
strvec.向后推(出);
}

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

例如,当您第一次分配所有内存时,库会从操作系统分配一组虚拟内存地址空间(可能是
mmap(2)
)但是当你使用完内存后,它会挂在虚拟地址空间上,假设你以后可能想要回内存,所以它不会调用
munmap(2)
来取消虚拟地址空间的映射


因此,即使所有内存都已从程序的角度正确释放,操作系统所看到的只是您分配了一堆虚拟内存,但却从未释放过。这就是为什么
top(1)
报告您的内存使用量没有减少,但这没什么可担心的。当您的程序再次需要内存时,它会从您已有的虚拟地址空间分配内存,因此在所有内存用完之前,您不会看到明显的内存使用量增加。

这是使用
top的一种特殊方法<问题是,数据结构释放的内存不会释放回操作系统,在顶部/代码>命令监视内存使用的级别。OS给程序的内存保留在程序中,直到C++内存管理器决定是时候了。将一些内存释放回操作系统

原因是,从操作系统分配内存相对昂贵,需要在相对大的块中完成。C++运行库的内存管理器从OS中获得内存“批发”,然后根据需要将其打包到程序的各个部分。
如果要验证内存是否确实被回收,请使用在较低级别上监视内存使用情况的工具,如。

如其他回答中所述,内存仍可用于进程,并且在程序退出之前不会从进程外部释放。如果您需要一个可以执行此操作的分配器,可以使用jemalloc签出它可以将内存释放回操作系统,在可伸缩的多线程应用程序(如facebook)中非常有用,但与其他任何应用程序一样,它也有其他成本。

尝试使用它进行调试将告诉您内存是否可用,并且可能比
top
更有用。人们坚持浪费内存是什么原因?可用内存不会兴——它并不比根本不在计算机中的内存好。只有在使用中的内存才有好处。