记忆失去了Valgrind

时间:2013-05-01 15:53:29

标签: 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;
    }   
}

提前感谢您的回复。

2 个答案:

答案 0 :(得分:2)

你什么时候有空的?看起来你的代码中没有一个免费版! (除了“freefileread”,但我们不知道它是做什么的,它似乎不是为该函数设计的!)

答案 1 :(得分:1)

我注意到的事情:

    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->model[0] = '\0';可以取消引用空指针。它应该删除。另外,this block of code could be replaced with a call to strdup.


    void InsertFct(function* fct, content c)
{
    if (type > 0)

......什么是type?某种全球性的?糟糕的设计,如果是这样。

此后的代码可以再次调用strdup


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

为什么将指针设置为NULL而不先释放它们?顺便说一句,free(NULL)什么都不做,所以你不必做if(ptr) free(ptr);之类的事情......只需致电free(ptr);