内存泄漏使用结构

时间:2012-03-23 22:10:23

标签: c++ memory struct memory-leaks

我从以下代码中收到内存泄漏:

  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。我在operator*(mat A,mat B)函数中遇到malloc失败,我假设是由于内存泄漏(任务管理器最多显示内存使用情况)。任何人都可以解释为什么存在内存泄漏(假设事实上是问题)?我是否必须释放任何mat的A,B或C?从mat操作返回的operator*是否会被释放,这可能是我的问题吗?谢谢你的帮助!

编辑:抱歉忘记了makemat功能。它已在上面添加。

EDIT2:我试图弄清楚细节并使其更加简洁。我可以告诉的唯一一个不断分配内存的函数是operator *函数。返回记忆会发生什么,我怎么能释放它(如果这确实是造成泄漏的原因 - 正如大卫在答案中提到的那样)?

2 个答案:

答案 0 :(得分:2)

由于代码中没有调用free_mat,显而易见的答案是肯定的,你有内存泄漏。我还可以假设你没有在free_mat的参数上调用makemat,这意味着在operator*内获得的内存将被泄露。在你没有提供的唯一函数中的其他地方或者其他地方,你在循环中调用的是你正在泄漏的内存。

答案 1 :(得分:0)

operator*声明中,为本地结构变量C的成员分配内存。这会产生内存泄漏,因为operator*函数返回后无法访问此分配的内存。解决方案是在此函数之外分配此内存,并将分配的内存传递给函数,以便对其执行操作。另一种解决方案是不使用动态内存分配。

所有这一切,正如评论中所建议的那样,最安全的选择是忘记指针分配,而用C ++编码。使用具有自动内存分配的容器。