首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c++中找不到内存泄漏

在c++中找不到内存泄漏
EN

Stack Overflow用户
提问于 2011-08-17 22:03:28
回答 5查看 581关注 0票数 1

我运行调用createNewMatrix的createNewBoard,然后退出程序,但是我找不到内存泄漏。下面是代码

代码语言:javascript
复制
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结构的指针(它包含整数和一个二维指针数组),并且我有一个内存泄漏。下面是要传达的信息:

代码语言:javascript
复制
==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:

代码语言:javascript
复制
void freeBoard(BoardP board)
{
    if (board != NULL)
    {
        if(board->matrix != NULL)
        {
            free(board->matrix);
        }
        free(board);
    }
}

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-08-17 22:05:45

在释放matrix之前,您必须先释放单独的行。

代码语言:javascript
复制
for (i=0; i<height; i++)
{
    free(board->matrix[i]);
}
票数 6
EN

Stack Overflow用户

发布于 2011-08-17 22:07:33

对于矩阵,您可以为所有元素分配内存,但不能在函数freeBoard()中释放它们。

票数 0
EN

Stack Overflow用户

发布于 2011-08-17 22:08:13

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7094154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档