【问题标题】:Why is allocated memory not getting freed为什么分配的内存没有被释放
【发布时间】:2021-10-03 16:57:36
【问题描述】:

我遇到了问题,我真的不知道为什么以及如何发生。我会尽量解释自己。

代码有两个函数:main 和assemble。在 main 中,我只获取一些作为文档文件方向的参数,然后将每个参数发送到 assemble 函数。

在 assemble 函数中我打开文件,然后我启动一个链表,我为第一个节点找到内存,然后我将很多节点添加到列表中(那部分我没有在这里复制它,因为它很大但它工作正常),最后我关闭文件并释放链接列表。

这是代码:

typedef struct node {
    int location;
    char name[MAX_LABEL];
    char type;
    struct node * next;
} labVar;

int main(int argc, char *argv[]) {
if (argc == 1)
    printf("No file attached./n");
else {
    while(--argc) {
        argv++;
        assemble(*argv);
    }
}
return 0;
}

void assemble(char *file) {

FILE *iofp;
int i = 0;
labVar *nodeLabHead = NULL; /* initializing head of the labels' linked list */
labVar *nodeLabCurr = NULL; /* variable to go through the list */

if ((iofp=fopen(file,"r")) == NULL)
    printf("\nCan't open file \"%s\"\n", file);
else {
    printf("\nSuccess opening %s\n", file);

    nodeLabHead = (labVar *) malloc(sizeof(labVar));
    if (nodeLabHead == NULL) {
        printf("\nNo memory to allocate.\n");
        exit(0);
    }
    
    /*HERE I FILL  THE LINKED LIST WITH MANY NODES IN ANOTHER FUNCTION, IT WORKS*/
    
    fclose(iofp);

    while (nodeLabHead->next != NULL) {
        nodeLabCurr = nodeLabHead;
        nodeLabHead = nodeLabHead->next;
        free(nodeLabCurr);
    }
    free(nodeLabHead);
}
}

因此,对于我作为参数发送的各种文件,代码似乎都可以正常工作。但是,当我尝试使用多个参数运行代码(为每个参数调用 append 函数)时,它会进入无限循环。我知道它与释放内存有关,因为它卡在那个循环中。如果删除最后一行 (free(nodeLabHead);) 它只会在我输入具有更多节点的文件然后输入具有较少节点的文件时才会卡住,否则它可以工作。

我还注意到,一开始,在将内存分配给第一个节点时,nodeLabHead->next==NULL 按预期返回 1,但是在第二次到达那里时(使用第二个文件 nodeLabHead ->next==NULL 返回 0,表示它并没有真正被释放,我不明白为什么。

【问题讨论】:

  • “这里没有复制”。这不是一个好主意。我们需要查看能够重现问题的准确代码。您可能认为它没有问题(您甚至可能是对的),但我们需要验证该代码,并且我们需要它能够重现问题。症状的一个可能原因是列表没有正确构建 - 所以我们需要查看该代码。请提供完整的代码。见:How to create a Minimal, Reproducible Example
  • ... 其中“可以重现问题的确切代码”通常并不意味着“您的整个程序”或“您的程序的选定 sn-ps”。点击链接了解详情。

标签: c linked-list free argv


【解决方案1】:

您没有显示您的代码,但听起来正在发生的事情是您从未将 nodeLabHead->next 初始化为 NULL,因此它包含发生在分配的内存中的任何内容。碰巧你第一次调用你的函数时,它是 0,但后来它不是。

您从malloc 返回的内存未初始化——因此可能包含任何内容。如果您希望结构的每个字段具有可预测的值,则需要显式设置它。

尝试将malloc 调用更改为calloc,或在malloc 调用之后添加memset(nodeLabHead, 0, sizeof(labVar))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    相关资源
    最近更新 更多