Освобождение памяти между циклами выполнения

0

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

Вот как выглядит этот цикл:

float t = 0.20;
while(t<0.35){
    CustomClass a(t);
    a.runCalculations();
    a.writeResultsInFile("results_" + t);
    t += 0.001;
}

Если это уместно, программа представляет собой физическое моделирование, из которого я хочу получить результаты для нескольких значений внешнего параметра, называемого t для температуры. Похоже, что избыток памяти связан с тем, что он не "освобождает" пространство, занимаемое экземпляром моего класса, от одного выполнения цикла до следующего, которое, как я думал, было бы автоматическим, если оно было создано без использования указателей или new инструкции. Я попытался сделать это с деструктором для класса, но это не помогло. Может быть, из-за использования основной памяти моего класса является 2d-массив, определенный с новой инструкцией?

Точность, кажется, что вышеприведенный код не является проблемой (спасибо тем, кто указывает на это), так вот как я инициирую свой массив (по CustomClass большому объекту в моем CustomClass) в его конструкторе:

tab = new int*[h];
for(int i=0; i<h; i++) {
    tab[i] = new int[v];
    for(int j=0; j<v; j++) {
        tab[i][j] = bitd(gen)*2-1; //initializing randomly the lattice
    }
}

bitd(gen) - генератор случайных чисел, выводящий 1 или 0.

Кроме того, другой метод моего объекта CustomClass удваивает размер массива следующим образом:

int ** temp = new int*[h];
for(int i=0; i<h; i++) {
    temp[i] = new int[v];
    for(int j=0; j<v; j++) {
        temp[i][j] = tab[i/2][j/2];
    }
}
delete[] tab;
tab = temp;

Может ли быть, что я должен освободить указатель temp?

Теги:
memory

1 ответ

4
Лучший ответ

Вы пропускаете память.

Может ли быть, что я должен освободить te pointer temp?

Нет. После того, как вы выделите память для нового массива двойного размера и скопируйте содержимое, вы должны освободить память, на которую указывает та tab. Прямо сейчас вы delete [] tab; массив указателей с помощью delete [] tab; но память, на которую указывает каждый из этих указателей, теряется. Запустите цикл и удалите каждый из них. Только тогда tab = temp.

Еще лучше используйте стандартные контейнеры, которые обрабатывают управление памятью, чтобы вы могли забыть возиться с необработанными указателями и сосредоточиться на своей реальной работе.

  • 1
    +1 за последнее предложение.
  • 0
    Спасибо, я только добавил, что после копирования кода в массиве и в классе destructor => утечки больше нет;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню