2012-06-11 127 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); 

這是泄漏。你分配內存,但從來沒有免費