[英]Can't find memory leaks in c
我运行调用 createNewMatrix 的 createNewBoard 并退出程序,但我找不到 memory 泄漏。 这是代码
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 结构的指针(它包含整数和二维指针数组),并且我有一个 memory 泄漏。 这是消息:
==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);
}
}
任何想法为什么我有 memory 泄漏? 谢谢!
在释放matrix
之前,您必须释放各个行。
for (i=0; i<height; i++)
{
free(board->matrix[i]);
}
对于矩阵,您为所有元素分配 memory 但您没有在 function freeBoard()
中取消分配它们。
我没有看到混乱,您显然没有释放任何大小width*sizeof(char)
的height
arrays 。 通过output, height
和width
都是10。
您的免费free(board->matrix)
需要在createNewMatrix
的 NULL 检查中释放矩阵。
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
function 或创建一个保持其自身高度和宽度的矩阵结构可能更容易。
board->matrix
是指向您已动态分配的指针的指针。 首先,您使用calloc
分配第一个维度,并为每个索引使用calloc
分配另一个维度。 因此,您有一个指向 memory 块的指针数组,并且您必须释放每个块,由每个索引指示。
在您的代码中,您只需释放第一个维度,其每个位置都指向不同的块。 另一方面,这些二维中的块没有被释放。
你应该这样做:
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);
}
}
我在这篇文章中尝试过
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.