首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存丢失Valgrind

内存丢失Valgrind
EN

Stack Overflow用户
提问于 2013-05-01 23:53:29
回答 2查看 110关注 0票数 0

我有一个记忆丢失的问题,我不能解决:

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

通过以下功能生成:

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

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

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

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

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

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

代码语言:javascript
复制
    InsertShape(tmpheading, tmproot, &s, &s2);
    if (heading == NULL){
        tmpheading = NULL;
    }
        if (root == NULL){
        tmproot = NULL;
    }   
}

提前感谢您的回复。

EN

回答 2

Stack Overflow用户

发布于 2013-05-02 00:00:50

好吧,你什么时候会把它免费的?看起来你的代码中没有一个空闲的!(除了"freefileread",但我们不知道它是做什么的,而且它似乎不是为那个功能而设计的!)

票数 2
EN

Stack Overflow用户

发布于 2013-05-02 00:03:26

我注意到:

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

代码语言:javascript
复制
    void InsertFct(function* fct, content c)
{
    if (type > 0)

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

后面的代码可以再次替换为对strdup的调用。

代码语言:javascript
复制
InsertShape(tmpheading, tmproot, &s, &s2);
if (heading == NULL){
    tmpheading = NULL;
}
    if (root == NULL){
    tmproot = NULL;
}   

为什么不先释放指针就将指针设置为NULL?顺便说一句,free(NULL)什么也不做,所以你不必做像if(ptr) free(ptr);这样的事情……打电话给free(ptr);就行了。

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

https://stackoverflow.com/questions/16321590

复制
相关文章

相似问题

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