我運行了createNewBoard,它調用了createNewMatrix,並且我退出程序,並且出現內存泄漏,我找不到。這裏的代碼在c中找不到內存泄漏
BoardP createNewBoard(int width, int high)
{
BoardP board = (BoardP) malloc(sizeof(Board));
if (board == NULL)
{
reportError(MEM_OUT);
return NULL;
}
board->height = high;
board->width = width;
board->matrix = createNewMatrix(width,high);
printf("%c",board->matrix[1][1]);
if (board->matrix == NULL)
{
reportError(MEM_OUT);
freeBoard(board);
return NULL;
}
return board;
}
static char** createNewMatrix(int width, int height){
char** newMatrix = (char**) calloc(height,sizeof(char*));
int i;
for (i=0; i<height; i++)
{
newMatrix[i] = (char*) calloc(width,sizeof(char)); //LINE 71
if (newMatrix[i] == NULL)
{
int j;
for (j=0; j<i; j++)
{
free(newMatrix[j]);
}
free(newMatrix);
return NULL;
}
}
return newMatrix;
}
這讓我瘋狂。我所做的只是創建一個指向Board結構(指向整數和二維指針數組)的指針,並且存在內存泄漏。這裏的消息:
==10436== HEAP SUMMARY:
==10436== in use at exit: 100 bytes in 10 blocks
==10436== total heap usage: 12 allocs, 2 frees, 196 bytes allocated
==10436==
==10436== 100 bytes in 10 blocks are definitely lost in loss record 1 of 1
==10436== at 0x4C2380C: calloc (vg_replace_malloc.c:467)
==10436== by 0x4008C6: createNewMatrix (Board.c:71)
==10436== by 0x40081E: createNewBoard (Board.c:55)
==10436== by 0x4007C6: createNewDefaultBoard (Board.c:37)
==10436== by 0x400F0C: main (PlayBoard.c:11)
==10436==
==10436== LEAK SUMMARY:
==10436== definitely lost: 100 bytes in 10 blocks
==10436== indirectly lost: 0 bytes in 0 blocks
==10436== possibly lost: 0 bytes in 0 blocks
==10436== still reachable: 0 bytes in 0 blocks
==10436== suppressed: 0 bytes in 0 blocks
它指向我的第71行,它調用矩陣中的行calloc。當程序退出時,它會調用freeBoard:
void freeBoard(BoardP board)
{
if (board != NULL)
{
if(board->matrix != NULL)
{
free(board->matrix);
}
free(board);
}
}
任何想法爲什麼我有內存泄漏?謝謝!
太好了!但是這裏有一個問題:我的calloc只能分配矩陣中的部分行嗎?我能夠通過預期的線路數量並將其全部釋放嗎?還是必須知道分配了多少條線路? – yotamoo
從頭開始將所有行設置爲NULL。如果'calloc'失敗,它也返回NULL。在C中,它對'free(NULL)'是合法的。 – cnicutar