Там нет утечки памяти, но вы должны использовать new / delete [] вместо malloc / free. Тем более, что ваша функция является шаблонной.
Если вы когда-нибудь захотите использовать тип с нетривиальным конструктором, ваша функция на основе malloc не работает, поскольку она не вызывает никаких конструкторов.
Я бы заменил "dvector" на следующее:
void DiscontinuousGalerkin_Domain::computeFaceInviscidFluxes(){
double *Left_Conserved = new double[NumberOfProperties];
//do stuff with Left_Conserved
//
delete[] Left_Conserved;
}
Он функционально эквивалентен (за исключением того, что он может вызывать конструкторы для других типов). Это проще и требует меньше кода. Кроме того, каждый программист на С ++ сразу узнает, что происходит, поскольку в нем нет дополнительной функции.
Еще лучше, используйте умные указатели, чтобы полностью избежать утечек памяти:
void DiscontinuousGalerkin_Domain::computeFaceInviscidFluxes(){
boost::scoped_array<double> Left_Conserved(new double[NumberOfProperties]);
//do stuff with Left_Conserved
//
}
Как многие умные программисты любят говорить, «лучший код - это код, который вы не должны писать»
РЕДАКТИРОВАТЬ: Почему вы считаете, что код, который вы опубликовали утечки памяти?
РЕДАКТИРОВАТЬ: Я видел ваш комментарий к другому сообщению, говоря
При выполнении кода команда top показывает
выделенная память растет
на неопределенный срок!
Это может быть абсолютно нормальным (или не вполне) в зависимости от вашей схемы распределения. Обычно способ работы кучи состоит в том, что они часто растут, но не часто сжимаются (это способствует последующему распределению). Полностью симметричные распределения и освобождения должны позволить приложению стабилизироваться при определенном объеме использования.
Например:
while(1) {
free(malloc(100));
}
не должно приводить к непрерывному росту, потому что куча, скорее всего, даст один и тот же блок для каждого malloc.
Так что мой вопрос к вам. Растет ли он «бесконечно» или просто не сжимается?
EDIT:
Вы спросили, что делать с 2D-массивом. Лично я бы использовал класс, чтобы обернуть детали. Я бы либо использовал библиотеку (я считаю, что в boost есть класс массива с n-мерной размерностью), либо переход на собственную не должен быть слишком сложным. Что-то вроде этого может быть достаточно:
http://www.codef00.com/code/matrix.h
Использование происходит так:
Matrix<int> m(2, 3);
m[1][2] = 10;
Технически более эффективно использовать что-то вроде operator () для индексации класса-оболочки матрицы, но в этом случае я решил симулировать синтаксис собственного массива. Если эффективность действительно важна, ее можно сделать такой же эффективной, как и собственные массивы.
РЕДАКТИРОВАТЬ: другой вопрос. На какой платформе вы разрабатываете? Если это * nix, то я бы порекомендовал valgrind, чтобы помочь выявить утечку памяти. Поскольку предоставленный вами код явно не является проблемой.
Я не знаю ни одного, но я уверен, что в Windows также есть инструменты профилирования памяти.
РЕДАКТИРОВАТЬ: для матрицы, если вы настаиваете на использовании простых старых массивов, почему бы просто не выделить ее как один непрерывный блок и выполнить простую математику при индексации следующим образом:
T *const p = new T[width * height];
затем, чтобы получить доступ к элементу, просто сделайте это:
p[y * width + x] = whatever;
таким образом вы делаете delete[]
для указателя, будь то массив 1D или 2D.