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);
}
对不起,我觉得我离开了一些关键的东西。我在程序中的每个“PDouble”中添加了稍后调用的函数。那不是免费的吗? – SetSlapShot
不,当您调用它时,从第一次分配中获得的指针已经丢失。由于分配与“if”之前的分配完全相同,请将其删除。或者在'else'块的开始部分放一个'free(evaluate [i] - > changeMatrix [j] [k]);''。 –
明白了。甚至没有意识到我正在将它重新分配两次。谢谢! – SetSlapShot