【问题标题】:Memory Leak (Stack/Linked List Data Structure)内存泄漏(堆栈/链表数据结构)
【发布时间】:2020-09-13 06:38:52
【问题描述】:

非常不言自明。我需要帮助解决内存泄漏问题。请查看下面的代码和屏幕截图。我很高兴回答任何其他问题或澄清更多:)

我的任务是构建堆栈数据结构 (LIFO)。这样做时,我在释放 malloc 的堆内存时遇到了一些麻烦。我使用 mystack.h 作为头文件,使用 main.c 来测试我的程序。两者都是要求。 V.Imp:我不允许更改任何函数的签名。

【问题讨论】:

标签: c memory memory-leaks stack heap-memory


【解决方案1】:

stack_enqueue 函数中有这两行:

node_t *n = (node_t*)malloc(sizeof(node_t));
s->head[s->count++] = *n;

第一行动态分配内存。第二行从n 指向的位置复制。然后你只需丢弃指针n 和它指向的内存。这确实是内存泄漏。

简单的解决方案是添加:

free(n);

分配之后。

这个和你的整个“列表”实现有一个小问题,因为你拥有的并不是一个真正的列表,而是一个简单的结构对象数组。您可以将stack_enqueue 的相关行替换为例如:

s->head[s->count++].data = item;

然后根本不用理会列表部分(基本上删除结构的next 成员,以及所有“列表”处理)。


我认为您误解了练习的目的。如果s->head 是指针,则不应将其视为数组,而应将其视为指向列表第一个节点的指针。

所以你会有类似的东西

+---------+ +------------+ +-------------+ +--------- --+ | s->头| -> |第一个节点 | -> |第二个节点 | -> ... -> |最后一个节点 | --> 空 +---------+ +------------+ +-------------+ +--------- --+

s->head指向第一个节点。第一个节点next指针指向第二个节点,以此类推

您当前的代码中根本没有这样的节点链接。

如果您在理解链表方面有困难,您的教科书应该包含有关它的信息,并且您的班级也应该提出它。并且在整个互联网上必须有数以百万计的资源可用于关于如何实施手把手列表。

【讨论】:

  • 一些我不能改变的事情是:所有函数的签名,typedef struct node 内部的内容,以及 typedef structt 堆栈。所以不幸的是我必须利用下一个我相信
  • 我加了free(n);就在这两条线的正下方,但不幸的是仍然无法正常工作
  • free(n)存在分段错误;并且没有 free(n) 存在内存泄漏;
  • @KhalidAyazKhan 如果您在调试器中发现崩溃,我敢打赌这不是因为free 调用,而是因为您可能仍然使用s->head 作为数组而不是列表。 free_stack 中的整个循环“释放”节点也是错误的。而且您还没有向我们展示create_stack 函数,它也可能包含错误。总而言之,这确实变得非常广泛,因为它需要一个关于链表的教程,而这并不是一个真正的教程网站。但如前所述,互联网上肯定有数百万的教程(以及在您的教科书或课堂上)。
  • 很抱歉,代码的某些部分丢失了。我已经更新了
猜你喜欢
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多