c - 为什么会泄漏内存? (指针数组 C)

标签 c memory-leaks malloc valgrind

早上好-

valgrind 说:

==9735== 24,976 bytes in 446 blocks are definitely lost in loss record 9 of 9
==9735==    at 0x100012362: malloc (vg_replace_malloc.c:266)
==9735==    by 0x1000016F2: interpolate (in ./a.out)
==9735==    by 0x100000CFA: main (in ./a.out)

哎呀。这是我的插值函数:

void interpolate(PDouble* evaluated, int doubleCount){
int i, j, k;
int boxCount = 0;
int frameCount = 0;

for(i=0; i<doubleCount; i++){
  boxCount = evaluated[i]->first->numBoxes;
  frameCount = evaluated[i]->gap;
  evaluated[i]->changeMatrix = (int***)malloc(boxCount*sizeof(int**));

for(j=0; j < boxCount; j++){
  evaluated[i]->changeMatrix[j] = (int **)malloc(ATTR * sizeof(int*));

  for(k=0; k < ATTR; k++){
    evaluated[i]->changeMatrix[j][k] = (int*)malloc(sizeof(int)*frameCount);
    if(evaluated[i]->differenceMatrix[j][k] > 200 ||
       evaluated[i]->differenceMatrix[j][k] < -200){
      generateRotationSequence(evaluated[i]->changeMatrix[j][k],
                               evaluated[i]->first->boxes[j]->o,
                               evaluated[i]->second->boxes[j]->o,
                               frameCount);
    }
    else{
      evaluated[i]->changeMatrix[j][k] = (int*)malloc(sizeof(int)*frameCount);
      generateSequence(evaluated[i]->changeMatrix[j][k], 
                       evaluated[i]->differenceMatrix[j][k], frameCount);
    }
   }
  }
 }
}

但是我有释放所有 PDouble 指针的 C 函数。如果需要,我可以提供代码,但是有什么明显的东西会导致它泄漏,或者使指针悬空吗?

编辑:意识到我在描述中使用了一个奇怪的术语。这次我还添加了我的析构函数

void killDouble(PDouble marked){
int i, j, k;
int gap = marked->gap;
for(i=0; i < marked->first->numBoxes; i++){
  for(j=0; j < ATTR; j++){
    free(marked->changeMatrix[i][j]);
  }
  free(marked->changeMatrix[i]);
  free(marked->differenceMatrix[i]);
}
for(i=0; i < gap; i++){
  killFrame(marked->intFrames[i]);
}
killFrame(marked->first);
killFrame(marked->second);
free(marked->changeMatrix);
free(marked->differenceMatrix);
free(marked->intFrames);
free(marked);
}

最佳答案

你分配evaluated[i]->changeMatrix[j][k]

evaluated[i]->changeMatrix[j][k] = (int*)malloc(sizeof(int)*frameCount);
if(evaluated[i]->differenceMatrix[j][k] > 200 ||
   evaluated[i]->differenceMatrix[j][k] < -200){
  generateRotationSequence(evaluated[i]->changeMatrix[j][k],
                           evaluated[i]->first->boxes[j]->o,
                           evaluated[i]->second->boxes[j]->o,
                           frameCount);
}
else{
  evaluated[i]->changeMatrix[j][k] = (int*)malloc(sizeof(int)*frameCount);

无条件释放,如果条件不满足则不释放。那是你的泄漏。

由于两个分配完全相同,您应该删除 else block 中的分配,这是没有意义的。

关于c - 为什么会泄漏内存? (指针数组 C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10983518/

相关文章:

c - 为什么 printf ("%02x"...) 改变输出?

javascript - jQuery 可拖动 : memory leak

iphone - MKMapView initWithFrame 不使用 ARC 释放内存

c - Realloc 在字符串调整大小函数中失败

在 C 中创建 Mallocate 数组函数

c++ - 使用 realloc 的段错误

C迭代结构数组

C: 类型定义不完整 'struct date' 错误

c - GCC -nostdlib 失败, undefined reference `__libc_csu_fini'

c - 释放由 malloc 分配的结构的结构会导致错误?