При возврате в область действия std :: vector <std :: vector <double>> в конечном итоге используется вся память - PullRequest
0 голосов
/ 18 сентября 2018

Если вы позволите приведенной ниже программе работать неопределенно долго, она, в конечном итоге, израсходует всю оперативную память, и ОС начнет заменяться (потребовалось ~ 5 минут, чтобы занять 64 ГБ на моей рабочей станции).Если это правда, что здесь ответили: Когда на самом деле освобождается куча памяти? , тогда почему операционная система заменяется, а не восстанавливает неиспользованную оперативную память?

Как вы можете видетьв приведенном ниже коде большой вектор предположительно должен быть освобожден к концу каждого цикла (выходит из области видимости).Итак, я ожидал, что программа будет постоянно занимать одно и то же количество оперативной памяти.

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