C:即使释放了结构,程序也会打印垃圾文本

问题描述 投票:1回答:2

我有一个具有以下结构的程序:

typedef struct slide
{
    int number;
    int maxX;
    int y;
    int r, g, b;
    struct line *first;
} slide;

typedef struct line {
    char content[256]; // number subject to change
    int r, g, b;
    struct line *prev;
    struct line *next;
} line;

使用以下代码创建这些结构的实例:

slide* createSlideArray(int s) {
    slide* slides = malloc(sizeof(struct slide)*s);
    return slides;
}

line *nextLine(line *prev) {
    line *n = malloc(sizeof(line));
    n->prev = prev;
    prev->next = n;
    return n;
}

最后,这是在程序循环完成之后,在打开新文件之前释放结构的代码:

void freeLines(line *l) {
    line *next;
    while(l) {
        next = l->next;
        free(l);
        l = next;
    }
}

主要:

int i;
for (i=0;i<slideCount;i++) {
    freeLines(slides[i].first); // works through next till NULL
}
free(slides);

如您所见,幻灯片结构的实例包含一个“第一”行结构,该行结构是一个双向链接列表。该行的内容被读取到屏幕上(使用ncurses)

虽然在程序循环中,用户可以键入命令:open filename打开新文件,但这是我的问题所在。

此幻灯片和线条应被释放。当循环再次开始时,它将打开一个新文件,创建幻灯片和线条,并将其用作内容。但是,内容部分填充有垃圾文本。我很确定这个问题在结构行中以及它是如何免费的。我没看到我做错了。

编辑:我应该清楚地说明,在程序的第一次迭代中,文本是完美的,只有当我尝试解析新文件时,垃圾文本才会出现,并且垃圾文本非常同质(出现在每行,相同的字符)

我正在使用Ubuntu,如果有帮助的话。

这里是项目的链接:DSS

c memory-management struct malloc free
2个回答
0
投票

通过阅读您帖子中的代码,我可以发现一些明显的问题。我无法确切地说出这些问题是否与您的问题有关,因为您帖子中的代码不是可编译的示例,并且我也没有深入研究您的链接项目。

您的nextLine函数

您忽略了设置n->下一个。

如果有一个节点,您还忽略了设置下一个节点的上一个指针。 (prev-> next-> prev如果prev-> next!= NULL)。

您当前的设计使您无法使用此功能来设置列表中的第一个节点。它还没有显示您打算如何创建该节点。

此功能不允许您将节点添加到列表的开头。

您的createSlideArray函数:

此功能不会初始化它创建的幻灯片。这些幻灯片实例必须初始化。在这里执行此操作似乎很明智,但您可能有充分的理由在其他位置执行此操作。无论哪种情况,初始化slideObject.first成员都是至关重要的。没有此功能,您将无法判断幻灯片是否包含行列表,并且freeLines函数将失败,因为它将作为参数传递给垃圾。

注意:

实现双向链接列表的另一种方式是使用始终存在的“头节点”,并链接到列表中的第一个和最后一个节点。这简化了一些问题,但改变了其他问题。如果您有兴趣,可以对此进行研究。


0
投票

我能够通过简单地调用memset来解决此问题。对于行,我能够执行以下操作:

memset(l, 0, sizeof(*l));

重要的是要获得l指针处的值的大小,而不是指针本身的大小,否则,您将无法正确释放内存。这是我面临的问题。

© www.soinside.com 2019 - 2024. All rights reserved.