Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 对释放循环中的malloc内存感到困惑吗_Loops_Malloc - Fatal编程技术网

Loops 对释放循环中的malloc内存感到困惑吗

Loops 对释放循环中的malloc内存感到困惑吗,loops,malloc,Loops,Malloc,我刚刚完成了cs50的pset5,其中一个函数用于将字典的内容加载到哈希表中。在所述函数的循环中,我必须为一个节点分配malloc内存,稍后我将分配给哈希表中的节点 当我尝试在每次循环迭代后释放节点n时,我的函数将无法工作。 当我不释放它时,它确实工作了,更令人困惑的是,它还通过了valgrind检查和cs50的内存泄漏检查 我的问题是: 如何释放“node n”以允许我的函数仍然工作 为什么valgrind在我没有释放“n”时没有检测到任何内存泄漏?这是未定义行为的例子吗 循环中的mall

我刚刚完成了cs50的pset5,其中一个函数用于将字典的内容加载到哈希表中。在所述函数的循环中,我必须为一个节点分配malloc内存,稍后我将分配给哈希表中的节点

当我尝试在每次循环迭代后释放节点n时,我的函数将无法工作。 当我不释放它时,它确实工作了,更令人困惑的是,它还通过了valgrind检查和cs50的内存泄漏检查

我的问题是:

  • 如何释放“node n”以允许我的函数仍然工作

  • 为什么valgrind在我没有释放“n”时没有检测到任何内存泄漏?这是未定义行为的例子吗

  • 循环中的malloc是如何工作的,它是每次分配新的内存块还是覆盖以前的内存块

  • 如有任何答复,将不胜感激

    代码如下:

    bool load(const char *dictionary)
    {
    
        //Setting counter to determine wheather node comes second in linked list or not.
        int counter = 0; 
        //declaring string array to store words from dictionary
        char word1[LENGTH +1]; 
        
        FILE *dic = fopen(dictionary, "r");
        if(dic == NULL)
        {
            return false;
        }
        //Loop loading words from dictionary to hash table
        while(fscanf(dic, "%s", word1) != EOF )
        {
            node *n = malloc(sizeof(node));
            if (n == NULL)
            {
                return false;
                free(n);
            }
    
            int i = hash(word1);
            //Storing word in temporary node
            strcpy(n->word, word1);
            n->next = NULL;
            //Three different conditions(first node of[i], second node of[i], and after second node of[i])
            if(table[i] == NULL)
            {
                table[i] = n;
                counter++;
                counter2++;
            }
            else if (counter == 1)
            {
                table[i]->next = n;
                counter = 0;
                counter2++;
            }
            else
            {
    
                n->next = table[i];
                table[i] = n;
                counter2++;
            }
    
    
        }
        
        fclose(dic);
        return true;
    
  • 加载时不能释放内存。你在卸货时把它放出来。这就是重点

  • 如果valgrind没有检测到内存泄漏,那么您可能有一个正常的卸载功能。为什么会是未定义的行为

  • 它将每次分配新内存。如果不是这样的话,这是行不通的


  • 我想我刚刚理解,当我将指针“node n”分配给“table[I]”时,table[I]会超过分配给“node n”的内存,对吗?这可以解释一切。对不起,我还在想一些基本概念。@WojtekZ是的,表[I]拥有这些内存。