Почему копирование экземпляра объекта в цикле занимает огромную память в 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 ++.
Спасибо

0

Решение

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

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

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

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

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

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

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

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

0

Другие решения

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

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

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

0

По вопросам рекламы [email protected]