arrays - 程序中的C内存泄漏

标签 arrays c pointers memory-leaks malloc

我需要关于程序中我没有释放分配的内存的建议。在我看来,它在评论部分的某个地方,在这种形式中是为了编译我。
在这里,以某种方式,我处理内存并尝试释放它。
写信时free(diagonaly);在 if(nr<=0 ) 中抛出一个错误。
这个条件在对角线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);
}

最佳答案

我很确定这个答案永远不会被阅读,但无论如何......
问题是你没有初始化 diagonaly .所以如果你提供一个空行作为你的第一行,它将指向内存中的一个随机位置和 free()可能会导致您的程序崩溃。
解决方案是记住初始化你的指针:

char **diagonaly = NULL;
当然,你不应该做free(diagonaly[0]) , 因为 nr0 , 意味着取消引用 diagonally是错的。

关于arrays - 程序中的C内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65061744/

相关文章:

c++ - 将 FILE * 或 HANDLE 转换(分配)到 Windows 中的 IStream

c++ - 隐式转换和指针?

java - 我将如何用正则表达式拆分这个表达式?

c - 在 C 中,如何用特定模式初始化数组?

c++ - char * 到 wchar_t * 函数实现

C++ : Print value of unsigned short variable as unicode character

c++ - 访问c++'s vector pointer'的元素

c - 新手 C 程序员对错误感到好奇

java - 从字符串数组中解析 int 时出现 ArrayIndexOutOfBound

c# - 为什么字节数组的大小不等于字符串的大小?