Can';在c中找不到内存泄漏

Can';在c中找不到内存泄漏,c,memory,C,Memory,我运行createNewBoard,调用createNewMatrix,然后退出程序,我发现了一个找不到的内存泄漏。这是密码 BoardP createNewBoard(int width, int high) { BoardP board = (BoardP) malloc(sizeof(Board)); if (board == NULL) { reportError(MEM_OUT); return NULL; }

我运行createNewBoard,调用createNewMatrix,然后退出程序,我发现了一个找不到的内存泄漏。这是密码

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;
 }
它将我指向第71行,它为矩阵中的一行调用calloc。当程序退出时,它调用干舷:

void freeBoard(BoardP board)
{
    if (board != NULL)
    {
        if(board->matrix != NULL)
        {
            free(board->matrix);
        }
        free(board);
    }
}

知道我为什么会有内存泄漏吗?谢谢

在释放
矩阵之前,必须先释放单独的行

for (i=0; i<height; i++)
{
    free(board->matrix[i]);
}
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);
    }
}
for(i=0;imatrix[i]);
}

在释放矩阵之前,必须先释放单独的行

for (i=0; i<height; i++)
{
    free(board->matrix[i]);
}
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);
    }
}
for(i=0;imatrix[i]);
}

对于矩阵,您为所有元素分配内存,但不在函数
干舷()中取消分配它们。

对于矩阵,为所有元素分配内存,但不在函数
freeBoard()
中取消分配它们

我没有看到混淆,您显然没有释放任何大小为
width*sizeof(char)
height
数组。根据输出,高度和宽度都是10。

我看不出有什么混淆,你显然没有释放任何大小为
width*sizeof(char)
height
数组。根据输出,高度和宽度都是10。

您的空闲
空闲(电路板->矩阵)
需要释放矩阵,就像您在
createNewMatrix
的空检查中释放矩阵一样

for (i=0; i<height; i++)
{
    free(board->matrix[i]);
}
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);
    }
}
void干舷(BoardP board)
{
如果(线路板!=NULL)
{
如果(电路板->矩阵!=NULL)
{
对于(int i=0;iheight;i++)
{
自由(板->矩阵[i]);
}
自由(电路板->矩阵);
}
免费(膳宿);
}
}
创建一个接受高度的
freeMatrix
函数,或者创建一个保持自身高度和宽度的矩阵结构,可能更容易。

您的空闲
free(board->matrix)
需要释放矩阵,就像在
createNewMatrix
的空检查中释放矩阵一样

for (i=0; i<height; i++)
{
    free(board->matrix[i]);
}
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);
    }
}
void干舷(BoardP board)
{
如果(线路板!=NULL)
{
如果(电路板->矩阵!=NULL)
{
对于(int i=0;iheight;i++)
{
自由(板->矩阵[i]);
}
自由(电路板->矩阵);
}
免费(膳宿);
}
}

创建一个接受高度的
freeMatrix
函数,或者创建一个保持自身高度和宽度的矩阵结构,可能会更容易。

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);
    }
}
void干舷(BoardP board)
{
int i;
如果(线路板!=NULL)
{
如果(电路板->矩阵!=NULL)
{
对于(i=0;iheight;i++);
自由(板->矩阵[i]);
}
免费(膳宿);
}
}

我试过的东西是一个指向指针的指针,它是动态分配的。首先,您使用
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);
    }
}
void干舷(BoardP board)
{
int i;
如果(线路板!=NULL)
{
如果(电路板->矩阵!=NULL)
{
对于(i=0;iheight;i++);
自由(板->矩阵[i]);
}
免费(膳宿);
}
}

我试过这个东西

太棒了!但这里有一个问题:我调用的代码只能分配矩阵中的部分行?我是否能够遍历预期的行数并释放它们,或者我必须知道分配了多少行?从一开始就将所有行设置为
NULL
。如果
calloc
失败,它也会返回NULL。在C语言中,
免费(空)
是合法的。太棒了!但这里有一个问题:我调用的代码只能分配矩阵中的部分行?我是否能够遍历预期的行数并释放它们,或者我必须知道分配了多少行?从一开始就将所有行设置为
NULL
。如果
calloc
失败,它也会返回NULL。在C语言中,
free(NULL)
是合法的。嗨,假设calloc在到达“board->height”之前失败,我不知道分配了多少行。如果我尝试释放未分配的行,会发生什么情况?这仍然会导致int泄漏,因为如果未分配,它不会释放
board->matrix
,然后将第一维度中的所有指针初始化为NULL。如果分配失败,则在释放时,您可以检查
board->matrix[i]
是否为空,然后调用
free
。您可以在
free
中传递空指针,如果您将空指针传递给
free
则不会执行任何操作。您好,假设calloc在到达“board->height”之前失败,我不知道分配了多少行。如果我尝试释放未分配的行,会发生什么情况?这仍然会导致int泄漏,因为如果未分配,它不会释放
board->matrix
,然后将第一维度中的所有指针初始化为NULL。如果分配失败