Aaron7
Aaron7

Reputation: 277

C memory leaks in program

I would need advice on where in the program I did not release the allocated 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.

When writing free(diagonaly); in if(nr<=0 ) throws me an error.

This condition is fulfilled at the moment when diagonaly diagonaly = (char**) malloc(sizeof(*diagonaly)*rDiagonaly) is allocated, but no line is allocated.

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

Upvotes: 1

Views: 110

Answers (1)

Costantino Grana
Costantino Grana

Reputation: 3428

I'm pretty sure this answer will never be read, but anyway...

The problem is that you didn't initialize 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.

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.

Upvotes: 1

Related Questions