Hy all,Выделенная функция для распределения памяти вызывает утечку памяти?
Я считаю, что следующий фрагмент кода создает утечку памяти?
/* External function to dynamically allocate a vector */
template <class T>
T *dvector(int n){
T *v;
v = (T *)malloc(n*sizeof(T));
return v;
}
/* Function that calls DVECTOR and, after computation, frees it */
void DiscontinuousGalerkin_Domain::computeFaceInviscidFluxes(){
int e,f,n,p;
double *Left_Conserved;
Left_Conserved = dvector<double>(NumberOfProperties);
//do stuff with Left_Conserved
//
free(Left_Conserved);
return;
}
Я подумал, что, передавая указатель на DVECTOR, было бы выделить его и вернуть правильный адрес, так что бесплатно (Left_Conserved) бы успешно освободить. Однако, похоже, это не так.
Примечание: Я также протестировал с новым/удалить замена таНоса/бесплатно без успеха либо.
У меня есть аналогичный код для выделения 2-мерного массива. Я решил управлять такими векторами/массивами, потому что я их много использую, и мне также хотелось бы понять немного более глубокое управление памятью на C++.
Итак, я бы очень хотел, чтобы внешняя функция выделяла для меня векторы и массивы. Какая уловка здесь, чтобы избежать утечки памяти?
EDIT
Я использую функцию DVECTOR выделить определенные пользователем типы, а также, так что потенциально проблема, я думаю, так как у меня нет Конструкторы называют.
Несмотря на то, что в части кода, прежде чем я освобожу вектор Left_Conserved, я также хотел бы выделить вектор и оставить его «открытым», который будет оцениваться через его указатель другими функциями. Если вы используете BOOST, он автоматически очистит выделение в конце функции, поэтому я не получу «общедоступный» массив с BOOST, не так ли? Я полагаю, что это легко установить с помощью NEW, но что будет лучшим способом для матрицы?
Только что произошло, что я передаю указатель в качестве аргумента для других функций. Теперь BOOST, похоже, не пользуется этим, и компиляция выходит с ошибками.
Итак, я стою с необходимостью указателя на вектор или матрицу, которая принимает пользовательские типы, которые будут переданы в качестве аргумента другим функциям. Вектор (или матрица) скорее всего будет выделен во внешней функции и освобожден в другой подходящей функции. (Я просто не хотел бы, чтобы скопировать цикл и новый материал для выделения матрицы везде в коде!)
Вот что я хотел бы сделать:
template <class T>
T **dmatrix(int m, int n){
T **A;
A = (T **)malloc(m*sizeof(T *));
A[0] = (T *)malloc(m*n*sizeof(T));
for(int i=1;i<m;i++){
A[i] = A[i-1]+n;
}
return A;
}
void Element::setElement(int Ptot, int Qtot){
double **MassMatrix;
MassMatrix = dmatrix<myT>(Ptot,Qtot);
FillInTheMatrix(MassMatrix);
return;
}
И не забудьте использовать удалить [] для массивов. Это одна из причин, по которой мне нравятся контейнеры STL: меньше простых способов повредить большой. –