简体   繁体   English

C memory 程序泄漏

[英]C memory leaks in program

I would need advice on where in the program I did not release the allocated memory.我需要关于我在程序中的哪个位置没有释放分配的 memory 的建议。 In my opinion, it is somewhere in the commented part, which in this form was to compile me.在我看来,它在评论部分的某个地方,以这种形式是为了编译我。

Here, in some way, I work with memory and try to free it.在这里,以某种方式,我使用 memory 并尝试释放它。

When writing free(diagonaly); free(diagonaly); in if(nr<=0 ) throws me an error.在 if(nr<=0 ) 中给我一个错误。

This condition is fulfilled at the moment when diagonaly diagonaly = (char**) malloc(sizeof(*diagonaly)*rDiagonaly) is allocated, but no line is allocated.此条件在对角diagonaly = (char**) malloc(sizeof(*diagonaly)*rDiagonaly)被分配的那一刻得到满足,但没有分配线。

int main (void)
{
    char **diagonaly;
    char **docasne;
    int rDiagonaly = 10;
    int cDiagonaly = -1;

    char *str = NULL;
    size_t  capacity = 0;
    int first = 1;
    int nr = 0;
    
    printf("Vypln:\n");
    while ( getline (&str, &capacity, stdin) != -1)
    {
        if(str[0] == '\n')
                break;
        //valid control
        if ( !validni(str, cDiagonaly) )
        {
            printf("Nespravny vstup.\n");
            for (int i = 0; i < nr; i++)
                free (diagonaly[i]);
            free(diagonaly);
            free(str);
            return 0;
        }
        
        if (first)
        {
            cDiagonaly = strlen (str)+1;
            diagonaly = (char**) malloc(sizeof(*diagonaly)*rDiagonaly);
            first = 0;
        }   
        
        if (nr==rDiagonaly)
            {
                rDiagonaly *= 2; 
                docasne = (char**)realloc (diagonaly, rDiagonaly*sizeof(*diagonaly));
                diagonaly=docasne;
            }
        
        diagonaly[nr]=(char*) malloc (cDiagonaly*sizeof(**diagonaly));
        strcpy(diagonaly[nr],str);
        
        nr++;
        
    }

    if(nr<=0 )
    {
        printf("Nespravny vstup.\n");
        free(str);
                //free (diagonaly[0]);
            //free(diagonaly);
            return 0;
        return 0;
    }   
    
    rDiagonaly = nr;
    char **maska;
    int rMaska = nr+1;
    int cMaska = cDiagonaly+1;
    str = NULL;
    capacity = 0;
    

    nr=0;
    
    maska=(char**)malloc (rMaska*sizeof(*maska));
    for (int i = 0; i < rMaska; i++)
        maska[i]=(char *) malloc (cMaska*sizeof(**maska));
    
    printf("Maska:\n");
    while ( getline (&str, &capacity, stdin) != -1)
    {
        
        if(nr == rMaska)
        {
            printf("Nespravny vstup.\n");
            
            for (int i = 0; i < rDiagonaly; i++)
                free (diagonaly[i]);
            free(diagonaly);
            
            for (int i = 0; i < rMaska; i++)
                free (maska[i]);
            free(maska);
            free(str);
            
            
            return 0;
        }
        //valid control
        if ( validniM(str, cMaska) )
        {
            strcpy(maska[nr],str);
        }
        else
        {
            printf("Nespravny vstup.\n");
            for (int i = 0; i < rDiagonaly; i++)
                free (diagonaly[i]);
            free(diagonaly);
            
            for (int i = 0; i < rMaska; i++)
                free (maska[i]);
            free(maska);
            free(str);
            return 0;
        }
        nr++;
    }
    
    if (nr != rMaska)
    {
        printf("Nespravny vstup.\n");
        for (int i = 0; i < rDiagonaly; i++)
                free (diagonaly[i]);
            free(diagonaly);
            
            for (int i = 0; i < rMaska; i++)
                free (maska[i]);
            free(maska);
            free(str);
        return 0;
    }   


    for (int i = 0; i < rDiagonaly; i++)
                free (diagonaly[i]);
            free(diagonaly);
            
            for (int i = 0; i < rMaska; i++)
                free (maska[i]);
            free(maska);
    free(str);
}

I'm pretty sure this answer will never be read, but anyway...我很确定这个答案永远不会被阅读,但无论如何......

The problem is that you didn't initialize diagonaly .问题是您没有初始化diagonaly So if you provide an empty line as your first line, it will be pointing to a random location in memory and free() will likely crash your program.因此,如果您提供一个空行作为第一行,它将指向 memory 中的一个随机位置,并且free()可能会使您的程序崩溃。

The solution is to remember to initialize your pointers:解决方案是记住初始化你的指针:

char **diagonaly = NULL;

Of course, you shouldn't be doing free(diagonaly[0]) , because nr was 0 , meaning that dereferencing diagonally is wrong.当然,您不应该这样做free(diagonaly[0]) ,因为nr0 ,这意味着diagonally解除引用是错误的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM