Почему копирование экземпляра объекта в цикле занимает огромную память в C++?

Я написал программу, которая работает итеративно, чтобы найти какое-то решение. Я изначально использовал векторы, чтобы иметь экземпляры объекта. Это работало нормально, но я предпочел иметь и экземпляр класса в качестве основного объекта, и временный объект, который выполняется в цикле while посредством некоторого вида копирования экземпляра. Работает нормально но медленнее. он также занимает почти в два раза больше оперативной памяти. (например, сначала 980 Мб, а после этого - около 1,6 Гб). Почему? Я действительно понятия не имею. Я взял строку "копирования" (которая не является конструктором копирования, но работает аналогично) из цикла, и она работает, как и ожидалось, с ожидаемым использованием ОЗУ, поэтому проблема возникает, когда "строка копирования" находится внутри цикла. Любая идея, почему это происходит?

упрощенный предварительный просмотр кода:

void SPSA::beginIteration(Model ins, Inventory inv_Data, vector <Result> &res)
{
bool icontinue=true;

while(icontinue)
{
    Model ins_temp(&ins, &inv_Data);
    if(model_counter>0)
        ins_temp.setDecesionVariableIntoModel(decisionVariable);
//something useful here
    model_counter++;
}

}

Код выше занимает много места в оперативной памяти. но код ниже в порядке:

void SPSA::beginIteration(Model ins, Inventory inv_Data, vector <Result> &res)
{
bool icontinue=true;
Model ins_temp(&ins, &inv_Data);
while(icontinue)
{
    if(model_counter>0)
        ins_temp.setDecesionVariableIntoModel(decisionVariable);
//something useful here
    model_counter++;
}
}

Кстати, я компилирую с использованием mingw++. Спасибо

2 ответа

Не пугайтесь сразу, если ваш код использует много памяти. Это не обязательно означает, что есть утечка памяти. C++ может не всегда возвращать память в ОС, но держать ее под рукой для будущих распределений. Она считается утечкой памяти только в том случае, если C++ теряет отслеживание состояния выделения и не может использовать эту память для будущих распределений.

Тот факт, что память удваивается независимо от количества итераций, говорит о том, что память используется повторно не при первой возможности, а при каждом втором выделении. Предположительно, вы получите два больших распределения, которые используются поочередно.

Возможно даже, что при втором выделении произошел сбой, первый блок был бы переработан, поэтому вы используете 1,6 ГБ памяти, потому что она есть.

Основным отличием является копирование модели N раз (один раз для каждого выполнения тела цикла, в зависимости от того, когда icontinue установлено), а не один раз.

Сначала попробуйте уменьшить проблему:

while(1) Model ins_temp(&ins, &inv_Data);

Если это также съедает память (значительно), то это проблема Model, (Выше цикла может съесть немного памяти из-за фрагментации - в зависимости от того, как Model реализовано.)

Наиболее вероятной причиной (без дополнительной информации) является утечка памяти в Model,

Другие возможности включают в себя: Model использует ленивый выпуск памяти (такой как / подобный сборщику мусора), Model использует общие указатели, и создание более одного экземпляра вызывает циклические ссылки, или вы столкнулись с очень уродливой, очень плохой проблемой фрагментации памяти (крайне маловероятно).

Как действовать

"Pro" решение будет использовать профилировщик памяти ( варианты для Mingw). Кроме того, изучите ваш код Model для утечек или уменьшить реализацию Model пока вы не найдете минимальное изменение, которое делает утечку уйти.

Другие вопросы по тегам