2011-08-17 68 views
1

我运行了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); 
    } 
} 

任何想法为什么我有内存泄漏?谢谢!

回答

6

在释放matrix之前,您必须先释放各条线。

for (i=0; i<height; i++) 
{ 
    free(board->matrix[i]); 
} 
+0

太好了!但是这里有一个问题:我的calloc只能分配矩阵中的部分行吗?我能够通过预期的线路数量并将其全部释放吗?还是必须知道分配了多少条线路? – yotamoo

+0

从头开始将所有行设置为NULL。如果'calloc'失败,它也返回NULL。在C中,它对'free(NULL)'是合法的。 – cnicutar

0

对矩阵你分配所有元素的内存,但你不会在功能freeBoard()解除分配它们。

0

我没有看到混淆,你清楚不要免费大小的任何width*sizeof(char)阵列。由输出去,既heightwidth是10

0

你免费free(board->matrix)需要释放你是如何释放它在createNewMatrix空校验矩阵。

void freeBoard(BoardP board) 
{ 
    if (board != NULL) 
    { 
     if(board->matrix != NULL) 
     { 
      for (int i = 0; i < board->height; i++) 
      { 
       free(board->matrix[i]); 
      } 
      free(board->matrix); 
     } 
     free(board); 
    } 
} 

它可以更容易地创建一个freeMatrix函数接受的高度,或创建维护其自己的高度和宽度的矩阵结构。

0

board->matrix是一个指向你已经动态分配的指针的指针。首先,您使用calloc分配第一个维度,并为每个索引分配,您使用calloc分配其他维度。因此,你有一个指向内存块的指针数组,你必须释放每个指针所指示的每个块。

在您的代码中,您只需释放第一个维度,其每个位置指向不同的块。另一方面,第二维中的这些块不会被释放。

你应该做这样的事情:

void freeBoard(BoardP board) 
{ 
    int i; 
    if (board != NULL) 
    { 
     if(board->matrix != NULL) 
     { 
      for (i=0; i<board->height; i++); 
       free(board->matrix[i]); 
     } 
     free(board); 
    } 
} 

我已经试过的事情in this post

+0

嗨,说calloc未达到'board-> height'之前失败,我不知道分配了多少行。如果我尝试释放未分配的行,会发生什么情况? – yotamoo

+0

这仍然会导致int泄漏,因为如果没有分配'board-> matrix' – Joe

+0

,则将第一维中的所有指针初始化为NULL。如果分配失败,那么在释放时,您可以检查'board-> matrix [i]'是否为NULL,然后调用'free'。你可以在'free'中传递NULL指针,如果你将NULL传递给'free',就不会执行任何操作。 – phoxis