我已经创建了一个基于链表的程序,其中每个节点都是一个结构,它包含一个8字节的整数和一个指向下一个节点的指针。队列遵循FIFO。它似乎工作正常,但我怀疑该程序可能会遭受堆中的某种内存泄漏或内存碎片。我可能错了 - 希望!!!当以FIFO顺序删除节点时,我使用库函数 free ,其中我放置了该节点的指针。当链表为空时,我还将指向第一个和最后一个节点的指针设置为NULL。
但有一件事我不理解,可能是内存泄漏的迹象。
假设我创建了3个包含3个整数的节点。这些节点的memoryaddresses如下:
205888
206032
206056
现在我决定删除这些节点并将资源释放到这三个节点。
当我开始添加节点时 - 第一个节点不从地址205888开始,它从地址206056开始。
这是否会在我的程序中显示内存泄漏?
这是破坏节点的功能。它将要删除的节点的地址作为参数
static int destroy_node(node *node_ref) {
int data = 0;
data = node_ref->data;
free(node_ref);
return data;
}
和结构
typedef struct node {
int data;
struct node *next;
} node;
答案 0 :(得分:1)
如果您释放了一块内存,则无法确定接下来会为您分配的内容。所以这种行为基本上不会显示内存泄漏。
您的代码中可能存在内存泄漏,但您无法使用分配的节点的地址检测到它。
要检测代码中的内存泄漏,您需要Valgrind
答案 1 :(得分:0)
这取决于堆中的算法。严格地说,这是“不确定的”并且不受你的控制。它可能是一个标志,但它不是证据。