使用结构的内存泄漏

Memory leak using structs

本文关键字:内存 泄漏 结构      更新时间:2023-10-16

以下代码导致内存泄漏:

  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)', #1n");
    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: %in",i); return 1; }
  }
  printf("i: %in",i);
  return 1;
}

代码终止于i=907174。我在operator*(mat A,mat B)函数中遇到malloc故障,我认为这是由于内存泄漏造成的(任务管理器显示最大内存使用量)。有人能解释为什么会有内存泄漏吗(假设这实际上是prolem)?我必须释放mat的A、B或C中的任何一个吗?从operator*操作返回的mat是否被释放,这可能是我的问题吗?谢谢你的帮助!

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

第二版:我试着去掉细节,使它更简洁。我能告诉你的唯一一个连续分配内存的函数是运算符*函数。返回的内存发生了什么?我该如何释放它(如果这确实是导致泄漏的原因——正如大卫在回答中所暗示的那样)?

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

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

尽管如此,正如评论中所建议的,你最安全的选择是在用C++编码时忘记指针分配。使用具有自动内存分配的容器。