Я получаю утечку памяти из следующего кода:
mat operator*(mat A,mat B) {
mat C;
int r,c;
C.ncol = B.ncol;
C.nrow = A.nrow;
C.val=(datatype**)malloc(sizeof(datatype*)*C.nrow);
if (C.val==0) {
printf("ERROR: malloc failed in 'mat operator*(mat A,mat B)', #1\n");
C.nrow = 0;
}
for (r=0; r<C.nrow; r++) {
C.val[r] = (datatype*)malloc(sizeof(datatype)*C.ncol);
}
/* matrix multiplication calculations */
return C;
}
int makemat(mat *A,mat B) {
int i,j;
if ( ((*A).nrow!=B.nrow)||((*A).ncol!=B.ncol) ) {
printf("ERROR: incompatible matrix dimensions for A=B.\n");
return 1;
}
for (i=0; i<(*A).nrow; i++) {
for (j=0; j<(*A).ncol; j++) {
(*A).val[i][j].tblflg = B.val[i][j].tblflg;
memcpy(&(*A).val[i][j].tname[0],&B.val[i][j].tname,namelen-1);
}
}
return 0;
}
int main() {
int i;
mat A;
mat B;
mat C;
mat D;
for (i=0; i<1e8; i++) {
/* I've tried doing D = A*B;
(makemat(&C,D)) { /* printf error */ }
but that doesn't work either
*/
if (makemat(&C,(A*B))) { printf("i: %i\n",i); return 1; }
}
printf("i: %i\n",i);
return 1;
}
Код заканчивается в i = 907174. Я получаю ошибку malloc в функции operator*(mat A,mat B)
, которая, как я полагаю, связана с утечкой памяти (диспетчер задач показывает максимальное использование памяти). Может кто-нибудь объяснить, почему происходит утечка памяти (если предположить, что это на самом деле проблема)? Должен ли я освободить любой из mat
s A, B или C? mat
, который возвращается из операции operator*
, когда-либо освобождается, и может ли это быть моей проблемой? Спасибо за любую помощь!
РЕДАКТИРОВАТЬ: извините забыл функцию makemat. Это было добавлено выше.
РЕДАКТИРОВАТЬ2: Я пытался извлечь детали и сделать его более кратким. Единственная функция, которую я могу сказать, которая постоянно выделяет память, это функция оператора *. Что происходит с возвратной памятью и как я могу ее освободить (если это действительно то, что вызывает утечку - как Дэвид упоминал в своем ответе)?