c - 内存丢失 Valgrind

标签 c

<分区>

我有一个我无法解决的失忆问题:

    ==19660== 14,583 (1,764 direct, 12,819 indirect) bytes in 49 blocks are definitely lost in loss record 27 of 27 
==19660==    at 0x4023F50: malloc (vg_replace_malloc.c:236)
==19660==    by 0x80489F5: AllocateFct (function.c:27)
==19660==    by 0x804BB51: InsertFct (reader.c:417)
==19660==    by 0x804BFFB: InsertShape (reader.c:591)
==19660==    by 0x804AEED: main (main.c:103)

通过以下特征生成:

    function AllocateFct(char* model)
{

    function fct = (function) malloc(sizeof(struct _function_));

    if (fct == NULL)
        return NULL;    
    if (model==NULL)
        fct->model = NULL;
    else
    {
        fct->model = malloc(sizeof(char) * (strlen(model) + 1));
        fct->model[0] = '\0';
        if (fct->model==NULL){
            fprintf(stderr,"Not enough memory!\n");
            exit(1);
        }
        strcpy(fct->model, model);
    }
    fct->detail = NULL;
    fct->brief = NULL;
    fct->bug = NULL;
    fct->f = NULL;
    fct->Parameter = NULL;
    fct->ret = NULL;
    fct->def = NULL;  
    fct->next = NULL;

    return fct;
}

=============================

    void InsertFct(function* fct, content c)
{
    if (type > 0)
    {
        type = c.code;
        (*fct)->def = (char*) malloc(sizeof(char) * (strlen(c.message) + 1));
    (*fct)->def[0]='\0';
    if ((*fct)->def==NULL){
        fprintf(stderr,"Not enough memory!\n");
        exit(1);
    }
            strcpy((*fct)->def, c.message);

            return;
    }
    switch (c.code)
    {
        case FN:
                type = 0;
                *fct = AllocateFct(c.message);
                break;
        case PARAM:
                type = 0;
                AddParameterFunction(*fct, c.message);
                break;
        case BRIEF:
                type = 0;
                AddBriefFunction(*fct, c.message);
                break;
        case DETAILS:
                type = 0;
                AddDetailFunction(*fct, c.message);
                break;
        case RETURN:
                AddRetourFunction(*fct, c.message);
                break;
        case BUG:
                type = 0;
                AddBugFunction(*fct, c.message);
                break;
        default:
                type = c.code;
            AddDefautFunction(*fct,c.message);
                break;
    }
}

===========================

 int InsertShape(list heading, list source, shape* finalShape, shape* tmp)
{
    fileRead* file = NULL;          
    shape s = NULL; 
    shape insert = AllocateShape(NULL);
    function fct = AllocateFct(NULL);
    function fctlist = NULL;
    int i = 0;
    int j = 0;
    int pile = 0;
    int n = 0;
    int tag = 0;
    list headerlist = NULL;
    content c;                  
    char chaine;

    if (heading != NULL )                   
    {
            char* recover = (char*) GetNameFile(heading->name);
            s = AllocateShape(recover);
        free(recover);
        recover=NULL;
    }
    else if (source != NULL )
    {
            char* recover = (char*) GetNameFile(source->name);
            s = AllocateShape(recover);
        free(recover);
        recover=NULL;
    }
    if (heading != NULL )
    {
            file = OpenFileRead(heading->name);
            n = CheckInclude(file->f, &headerlist);
            if (n == 0)
            n = 1;

            fseek(file->f, -n, SEEK_CUR);
            do
            {
                i = 0;
                j = RecoverComments(file, &c, &tag);
                InsertFct(&fct, c);
                if(c.message!=NULL){
                free(c.message);
                c.message=NULL;
            }

                if (type > 0)
                AddToShape(insert, fct);

                if (j == -5 && i == 0)
                {
                    type = 0;
                    do
                    {
                        if (fscanf(file->f, "%c", &chaine) == EOF)
                        {
                                i = 0;
                                break;
                        }
                    } while (chaine == ' ' || chaine == '\n');
                    if (chaine == '/')
                    {
                        i = 1;
                        j = 0;
                        fseek(file->f, -1, SEEK_CUR);
                    }
                }
                if (i == 0 && (j == -5))
                {
                    if (type == 0)
                    {
                        pile++;
                        fctlist = AddFunction(fctlist, fct);
                    }
                    else
                    type = 0;

                }
            } while (j != -3);
            FreefileRead(file);
    }
    i = 0;
    j = 0;
    type = 0;
    if (source != NULL )
    {
            file = OpenFileRead(source->name);
            n = CheckInclude(file->f, &headerlist);
            if (n == 0)
            n = 1;

            fseek(file->f, -n, SEEK_CUR);
            do
            {
                i = 0;
                j = RecoverComments(file, &c, &tag);
                InsertFct(&fct, c);

                if(c.message!=NULL){
                free(c.message);
                c.message=NULL;
            }

                if (type > 0)
                AddToShape(insert, fct);

                if (j == -5 && i == 0)
                {
                    type = 0;
                    do
                    {
                        if (fscanf(file->f, "%c", &chaine) == EOF)
                        {
                                i = 0;
                                break;
                        }
                    } while (chaine == ' ' || chaine == '\n');
                    if (chaine == '/')
                    {
                        i = 1;
                        j = 0;
                        fseek(file->f, -1, SEEK_CUR);
                    }
                }
                if (i == 0 && (j == -5))
                {
                    if (type == 0)
                    fctlist = TourAndChange(fctlist, fct);

                    else
                    type = 0;

                }
            } while (j != -3);
            FreefileRead(file);
    }
    s->fctList = AddFunction(s->fctList, fctlist);
    s->headerList = headerlist;
    *finalShape = CreateListShape(*finalShape, s);
    *tmp = CreateListShape(*tmp, insert);   

    return 1;
}

===================== 主要涉及的部分:

    InsertShape(tmpheading, tmproot, &s, &s2);
    if (heading == NULL){
        tmpheading = NULL;
    }
        if (root == NULL){
        tmproot = NULL;
    }   
}

预先感谢您的回复。

最佳答案

好吧,你什么时候释放它?看起来你的代码中没有一个 free ! (除了“freefileread”,但我们不知道它的作用,而且它似乎不是为该功能设计的!)

关于c - 内存丢失 Valgrind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16321590/

相关文章:

c++ - C/C++ 字符串文字中的未知元字符?

c - 找出 valgrind 提出的问题

c - 根据百分比从一种速度线性插值到另一种速度

c - 矩阵标准库

c - 我应该如何输入 cast void *?

c - 如何更改 OpenSSL 配置文件的位置

Mac 上未声明 CLK_TCK

从 uint16 到 uint8 的转换

c - 二分法——循环中断

c - 关于我的发送的问题 - 动态分配