我有这个(坏)代码
void function(deq** dq, int data)
{
// TODO: add a new element at the end of the queue
deq *temp = (dequeue*)malloc(sizeof(dequeue));
deq *copy = (*dq);
temp->data = data;
if (copy == NULL) {
temp->next = NULL;
temp->prev = NULL;
(*dq) = temp;
}
else{
while (copy->next != NULL) {
copy = copy->next;
}
temp->prev = copy;
temp->next = NULL;
copy->next = temp;
(*dq) = temp;
}
//free(temp);
}
我的问题是,我不能在没有崩溃程序的情况下释放温度有没有办法解决这个问题?并且有人可以告诉我为什么当我使用这个免费的时候我无法运行程序但是使用valgrind它可以运行...这很有趣。
==17186== HEAP SUMMARY:
==17186== in use at exit: 216 bytes in 9 blocks
==17186== total heap usage: 15 allocs, 6 frees, 360 bytes allocated
==17186==
==17186== 72 (24 direct, 48 indirect) bytes in 1 blocks are definitely lost in loss record 8 of 9
==17186== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17186== by 0x400670: dequeue_push_front (dequeue.c:12)
==17186== by 0x400A1D: main (main.c:21)
==17186==
==17186== 144 (24 direct, 120 indirect) bytes in 1 blocks are definitely lost in loss record 9 of 9
==17186== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==17186== by 0x400670: dequeue_push_front (dequeue.c:12)
==17186== by 0x400BA3: main (main.c:48)
==17186==
==17186== LEAK SUMMARY:
==17186== definitely lost: 48 bytes in 2 blocks
==17186== indirectly lost: 168 bytes in 7 blocks
==17186== possibly lost: 0 bytes in 0 blocks
==17186== still reachable: 0 bytes in 0 blocks
==17186== suppressed: 0 bytes in 0 blocks
==17186==
==17186== For counts of detected and suppressed errors, rerun with: -v
==17186== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
答案 0 :(得分:2)
你不想在这个功能中free(temp)
。
此函数使用temp
在堆上分配malloc
,然后将该节点放在列表中。如果您free()
刚刚在此处分配的内存,则会在列表中留下指向无效内存的节点。引用该节点会导致未定义的行为,在这种情况下会显示在核心转储中。
调用free()
的正确时间是从列表中删除节点时。
至于内存泄漏,else
块中发生了这种情况。
您将temp
放在列表的末尾,但随后用temp
覆盖列表的头部,因此您对列表其余部分的唯一引用位于{{1} } prev
的指针。但是,既然现在是你的新人,那么在清理时你可能不必费心去查看temp
。所以你有内存泄漏。
要修复泄漏,请删除prev
:
*dq
答案 1 :(得分:2)
您正在呼叫free(temp)
,但继续在行中使用temp
的值
(*dq) = temp;
和
copy->next = temp;
请勿致电free(temp)
。确保通过遍历链表并在所有节点上调用free
来释放调用函数中的所有内存。
在free
d之后访问内存是造成未定义行为的原因。
BTW,第二次使用
(*dq) = temp;
导致内存泄漏。删除该行。