2012-06-11 79 views
1

Gmorning SO-为什么这个泄漏的内存? (指针数组C)

的valgrind说:

==9735== 24,976 bytes in 446 blocks are definitely lost in loss record 9 of 9 
==9735== at 0x100: 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); 
    } 
    } 
    } 
} 
} 

但我有C函数释放所有指针的PDoubles。如果需要的话,我可以提供代码,但是有没有什么值得注意的事情会让它泄漏,或者让指针晃来晃去?

编辑:实现我在描述中使用了一个奇怪的术语。另外这个时间IM加入我的析构函数

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); 
} 

回答

5

你没有,如果条件不满足释放分配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块中的一个,这是毫无意义的。

+0

对不起,我觉得我离开了一些关键的东西。我在程序中的每个“PDouble”中添加了稍后调用的函数。那不是免费的吗? – SetSlapShot

+0

不,当您调用它时,从第一次分配中获得的指针已经丢失。由于分配与“if”之前的分配完全相同,请将其删除。或者在'else'块的开始部分放一个'free(evaluate [i] - > changeMatrix [j] [k]);''。 –

+0

明白了。甚至没有意识到我正在将它重新分配两次。谢谢! – SetSlapShot

2
evaluated[i]->changeMatrix[j][k] = (int*)malloc(sizeof(int)*frameCount); 

这是泄漏。你分配内存,但从来没有免费