首页 > 解决方案 > 我该如何纠正这种内存泄漏?

问题描述

这是我使用 malloc 为 C 中的二维数组分配内存并释放它的代码。N 是用户给定的数字

R = malloc(N * sizeof(int *)); // start of memory allocating for **R
if (R == NULL) { 
  return -1;
}

for (i = 0; i <= N; i++) {
  *(R+i) = malloc(N * sizeof(int));
  if (*(R + i) == NULL) {
    return -1;
  }
} // end of memory allocating for **R 

for (i = 0 ; i < N; i++){
  free(R[i]);
  free(R);
}

程序完成后,我收到此错误:double free or corruption (out) Aborted (core dumped)

通过使用 valgrind 进行调试,我收到以下消息:12 bytes in 1 blocks are definitely lost in loss record 1 of 1

在这行代码中检测到此泄漏(根据 valgrind):*(C+i) = malloc(N * sizeof(int));

有关如何修复它的任何帮助?

标签: cmallocfree

解决方案


我收到此错误:双重释放或损坏(出)中止(核心转储)

首先注意错误不是内存泄漏,双重释放来自该代码

for (i=0 ; i <N ; i++){
  free(R[i]);
  free(R);
}

必须是

for (i=0 ; i <=N ; i++){
  free(R[i]);
}
free(R);

否则你在第一个循环而不是循环之后释放R

因为从第二个循环开始,R[i]if undefined 的值和free的行为也未定义,并且您在R上再次调用free ,这两个原因都与valgrind产生的消息兼容。

请注意,我还将测试更改为i<=N与用于进行分配的测试相同,但两者都假设您的数组已调整大小N+1(至少),否则您会错过产生内存泄漏的空闲。

如果代码中的分配步骤和空闲步骤不是连续的,并且即使您无法在给定时间分配内存,也完成了空闲步骤,则必须将代码修改为:

if (R != NULL)
{
  for (i=0 ; i <=N ; i++){
    if (R[i] == NULL) /* allocation failed */
      break;
    free(R[i]);
  }
  free(R);
}

如果R为 NULL,则不取消对它的引用,并且不尝试释放未在分配循环中设置的数组的条目,因为(*(R + i) == NULL)它确实打破了循环


推荐阅读