0

解決できないメモリ損失の問題があります。

    ==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;
    }   
}

ご回答ありがとうございます。

4

2 に答える 2

2

じゃあいつ解放するの?コードに free が 1 つもないようです。(「freefileread」を除きますが、それが何をするのかわかりませんし、その機能用に設計されていないようです!)

于 2013-05-01T16:00:49.777 に答える
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';、null ポインターを逆参照している可能性があります。削除する必要があります。また、このコード ブロックは への呼び出しに置き換えることもできます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);です。

于 2013-05-01T16:03:26.380 に答える