Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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
cs50 pset5处于卸载功能、释放内存时内存泄漏_C_Memory Leaks_Hashtable_Cs50 - Fatal编程技术网

cs50 pset5处于卸载功能、释放内存时内存泄漏

cs50 pset5处于卸载功能、释放内存时内存泄漏,c,memory-leaks,hashtable,cs50,C,Memory Leaks,Hashtable,Cs50,我目前正在工作 当我试图释放程序中的所有内存时,遇到内存泄漏。 这个错误似乎发生在我的unload函数中,在这里它为指针游标指定malloc。 如果有人能就如何处理这个问题向我提供指导,请让我知道。 我还为我的代码提供了注释,以强调它正在做什么 那么为什么会发生内存泄漏呢? 然而,在我的代码中,我在使用游标和tmp指针之后释放了它们。 我不知道为什么会遇到错误,尽管我在函数末尾释放了它。是的,内存泄漏发生在这里!!!!正如你所说 您分配了两个缓冲区,但后来它们的指针被表[i]覆盖而没有被释放。

我目前正在工作

当我试图释放程序中的所有内存时,遇到内存泄漏。 这个错误似乎发生在我的unload函数中,在这里它为指针游标指定malloc。 如果有人能就如何处理这个问题向我提供指导,请让我知道。 我还为我的代码提供了注释,以强调它正在做什么

那么为什么会发生内存泄漏呢?

然而,在我的代码中,我在使用游标和tmp指针之后释放了它们。
我不知道为什么会遇到错误,尽管我在函数末尾释放了它。

是的,内存泄漏发生在这里!!!!正如你所说

您分配了两个缓冲区,但后来它们的指针被表[i]覆盖而没有被释放。这是内存泄漏

为了避免内存泄漏,请停止分配未使用的缓冲区

角色

    // allocate memory for struct type `node` pointer 
    node *cursor = (node*)malloc(sizeof(node));                 // MEMORY LEAK happens here !!!! :(
    node *tmp = (node*)malloc(sizeof(node));

    // if memory cannot be allocated successfully, return false
    if (cursor == NULL || tmp == NULL)
    {
        return false;
    }
应该是公正的

    // allocate memory for struct type `node` pointer 
    node *cursor;
    node *tmp;
指针的内存在堆栈上分配

也是这个部分

    // free memory for cursor
    free(cursor);

应删除,因为列表已被释放,从函数返回时,游标的内存将自动从堆栈中释放。

谢谢您的回答!你的回答确实很有趣,我想问你另一个关于你在这里写的问题。所以,您说被表[i]覆盖而不被释放,我相信您指的是tmp=table[i];上的代码;。为什么我不能覆盖指针?实际上,我想做的是,让tmp指向[I]所指向的任何表。这意味着,我只是将内存地址表[I]所保存的内容传递给tmp。为什么不允许这样做?表[i]和tmp都是相同的数据类型,它是指向节点的指针。节点是一种结构类型,只需将表[i]持有的内存地址传递给tmp是允许的。坏的是分配未使用的缓冲区,并通过分配新地址而不释放缓冲区来丢弃存储在tmp中的地址。
    // allocate memory for struct type `node` pointer 
    node *cursor;
    node *tmp;
    // free memory for cursor
    free(cursor);