Привет, я кодирую программу 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
?
Вы пропускаете память.
Может ли быть, что я должен освободить te pointer temp?
Нет. После того, как вы выделите память для нового массива двойного размера и скопируйте содержимое, вы должны освободить память, на которую указывает та tab
. Прямо сейчас вы delete [] tab;
массив указателей с помощью delete [] tab;
но память, на которую указывает каждый из этих указателей, теряется. Запустите цикл и удалите каждый из них. Только тогда tab = temp
.
Еще лучше используйте стандартные контейнеры, которые обрабатывают управление памятью, чтобы вы могли забыть возиться с необработанными указателями и сосредоточиться на своей реальной работе.