为什么C无法从strtok设置的malloc'char *中释放内存?

本·帕尔默

此函数从具有空格分隔值的文本文件中将值读取到2d数组中。当我运行它时,它工作得很好-但是通过Valgrind进行的内存泄漏检查确认了Xcode的怀疑,即从未两次释放“ char * splitString”,这是它的两次。我不明白这一点,考虑到我的“ char * buffer”似乎已被释放。任何帮助都非常感谢!

int** readMatrixFile(char* inFileName, int** matrix, int sizeY, int sizeX)
{
    FILE* matrixFP;
    int ii=0, jj=0, fileValid = 1;
    char *buffer, *splitString;
    const char delim[]=" \n\r";

    matrixFP = fopen(inFileName, "r");
    if(matrixFP != NULL)
    {
        /*Check if file is the same size as specified by the command line
         *assumed valid until the file is checked*/
        splitString = malloc(100*sizeof(char)); <------where allocated
        buffer = malloc(5000*sizeof(char));
        do
        {
            fgets(buffer, 5000, matrixFP);
            jj=0;
            splitString = strtok(buffer, delim);
            while(splitString != NULL)
            {
                jj++;
                splitString = strtok(NULL, delim);
            }
            if(jj!=sizeX)
            {
                fileValid = 0;
            }
            ii++;
        } while(!feof(matrixFP));
        if(ii != sizeY || buffer==NULL)
        {
            fileValid = 0;
        }

        free(splitString); <-----Appears to do nothing?
        free(buffer);

        if(fileValid) /*Files match to specified command line values*/
        {
            ii=0;
            rewind(matrixFP);
            matrix = (int**)malloc(sizeY * sizeof(int *));
            do
            {
                matrix[ii] = (int*)malloc(sizeX * sizeof(int));
                jj=0;
                do
                {
                    fscanf(matrixFP, "%d", &matrix[ii][jj]);
                    jj++;
                } while(jj<sizeX);
                ii++;
            } while(ii<sizeY && !feof(matrixFP));
        }
        else
        {
            printf("Error: File does not match size specified by the command line\n");
        }
        fclose(matrixFP);
    }
    else
    {
        perror("Error: File does not exist or is invalid");
        matrix = NULL;
    }

    return matrix;
}

和Valgrind输出:

==14087== Memcheck, a memory error detector
==14087== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==14087== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==14087== Command: ./pmms a b 10 3 10
==14087== 
/*irrelevent program output*/ 
==14087== 
==14087== HEAP SUMMARY:
==14087==     in use at exit: 200 bytes in 2 blocks
==14087==   total heap usage: 21 allocs, 19 frees, 11,680 bytes allocated
==14087== 
==14087== 100 bytes in 1 blocks are definitely lost in loss record 1 of 2
==14087==    at 0x4A06A2E: malloc (vg_replace_malloc.c:270)
==14087==    by 0x400B55: readMatrixFile (matrix_reader.c:35)
==14087==    by 0x40095E: main (pmms.c:23)
==14087== 
==14087== 100 bytes in 1 blocks are definitely lost in loss record 2 of 2
==14087==    at 0x4A06A2E: malloc (vg_replace_malloc.c:270)
==14087==    by 0x400B55: readMatrixFile (matrix_reader.c:35)
==14087==    by 0x400982: main (pmms.c:24)
==14087== 
==14087== LEAK SUMMARY:
==14087==    definitely lost: 200 bytes in 2 blocks
==14087==    indirectly lost: 0 bytes in 0 blocks
==14087==      possibly lost: 0 bytes in 0 blocks
==14087==    still reachable: 0 bytes in 0 blocks
==14087==         suppressed: 0 bytes in 0 blocks
==14087== 
==14087== For counts of detected and suppressed errors, rerun with: -v
==14087== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 6 from 6)
西亚潘

首先,您要进行迭代

    while(splitString != NULL)
    {
          ...
    }

所以循环完成后splitStringNULLfree(NULL)什么也不做。

第二,一旦分配了一个一百字节的内存块

    splitString = malloc(100*sizeof(char));   // (*)

splitString变量的下一个引用是赋值:

    splitString = strtok(buffer, delim);

因此,无论存储在变量中的什么,它都将被覆盖!现在splitString指向该buffer块的某个位置,并且分配在的块的地址将(*)永远丢失。顺便说一句,这表明您从未使用过该块,并且实际上不需要分配它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从C中的char数组释放内存

来自分类Dev

char后无法释放内存*

来自分类Dev

使用strtok构建char **后释放C语言的内存

来自分类Dev

释放C中的内存

来自分类Dev

无法在C中释放内存

来自分类Dev

无法在C中释放内存

来自分类Dev

在C中需要释放内存吗?

来自分类Dev

释放C中内存的正确方法

来自分类Dev

在C中循环分配和释放内存

来自分类Dev

链接列表和C中的释放内存

来自分类Dev

释放C中动态分配的内存

来自分类Dev

在C的递归子程序中释放内存

来自分类Dev

关于C ++中的内存释放的困惑

来自分类Dev

释放C ++中的非动态内存

来自分类Dev

在C中需要释放内存吗?

来自分类Dev

在C中释放内存不起作用

来自分类Dev

在C ++中终止进程并释放内存

来自分类Dev

在C中释放已分配的内存

来自分类Dev

如何释放内存到C中的指针

来自分类Dev

释放C中malloc()和realloc()分配的所有内存

来自分类Dev

释放char数组中的指针后,C程序崩溃*

来自分类Dev

在c中重新分配char **的内存

来自分类Dev

在c中重新分配char **的内存

来自分类Dev

Char * C ++中的数组内存分配

来自分类Dev

在 C++ 中为 char* 分配内存

来自分类Dev

C-如何正确释放指向n个char((* p)[n])数组的指针的内存?

来自分类Dev

类的析构函数是否会自动为char *类型的数据成员释放内存?C ++

来自分类Dev

无法在 C 中释放重新分配的内存

来自分类Dev

C char *,char **,char ***,打印和释放麻烦