Утечка памяти при использовании структур - PullRequest
0 голосов
/ 24 марта 2012

Я получаю утечку памяти из следующего кода:

  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: Я пытался извлечь детали и сделать его более кратким. Единственная функция, которую я могу сказать, которая постоянно выделяет память, это функция оператора *. Что происходит с возвратной памятью и как я могу ее освободить (если это действительно то, что вызывает утечку - как Дэвид упоминал в своем ответе)?

Ответы [ 2 ]

2 голосов
/ 24 марта 2012

Поскольку в коде нет вызова free_mat, очевидный ответ: да, у вас утечка памяти. Я также могу предположить, что вы не вызываете free_mat с аргументом makemat, что означает, что память, полученная внутри operator*, будет утечка. Либо это, либо еще где-то в единственной функции, которую вы не предоставили, что, кстати, является тем, что вы вызываете в цикле, у вас течет память.

0 голосов
/ 24 марта 2012

В вашем объявлении operator* вы выделяете память для члена локальной переменной структуры, C.Это создает утечку памяти, поскольку эта выделенная память становится недоступной после возврата из функции operator*.Решением было бы выделить эту память вне этой функции и передать выделенную память функции для операций, которые должны быть выполнены над ней.Другое решение состоит в том, чтобы не использовать динамическое выделение памяти.

Все, что сказано, как предложено в комментариях, ваша самая безопасная ставка - забыть о распределении указателей при кодировании на C ++.Используйте контейнеры с автоматическим распределением памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...