Can';在c中找不到内存泄漏
我运行createNewBoard,调用createNewMatrix,然后退出程序,我发现了一个找不到的内存泄漏。这是密码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; }
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。如果分配失败