首页 > 解决方案 > 推回范围内的 std::vector< std::vector> 最终耗尽所有内存

问题描述

如果您让下面的程序无限期地运行,它最终会耗尽所有 RAM 并且操作系统开始交换(在我的工作站中占用 64GB 大约需要 5 分钟)。如果这是真的,这里已经回答了:堆内存什么时候真正被释放?,那么为什么操作系统会进行交换而不是回收所谓的未使用的 RAM?

正如您在下面的代码中看到的那样,大向量应该在每个循环结束时被释放(超出范围)。所以,我希望程序一直占用相同数量的 RAM。

OBS:如果你的内存比较少,可以将nIter数字设置为较低的数字。

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int nIter = 700000000;
    while(true){
        std::vector< std::vector<double> > data;
        data.reserve(nIter);
        std::vector<double> dataLine( 7, 0.0 );
        for( int i = 0; i < nIter; ++i ){
            data.push_back( std::vector<double>() );
            data.back() = dataLine;
        }
    } //End of scope.

    return 0;
}

标签: c++stdvector

解决方案


推荐阅读