簡體   English   中英

在 c 中找不到 memory 泄漏

[英]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, heightwidth都是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM