我在下面的代码中获得了16字节的内存丢失以进行排队。能不能让我知道如何摆脱这个问题?代码是:
void enqueue( enqueuenode * queueNode1 ,bplus *bplusNew){
[98] -> enqueue *queue=NULL;
queue = malloc(sizeof(enqueue_node));
queue->bplus = bplusNew;
queue->next= NULL;
if(queueNode1->headNode == NULL){
queueNode1->headNode=queueNode1->tailNode = queue ;
}
else{
queueNode1->tailNode->next = queue;
queueNode1->tailNode = queue;
}
}
以下是两个结构
typedef struct enqueue_help{
bplus bplusNode;
struct enqueue_help * next;
}*enqueue,enqueue_node;
typedef struct enqueuenode_help{
enqueue headNode;
enqueue tailNode;
}*enqueuenode,enqueuenode_node;
对于上面的代码,以下是valgrind输出:
=23800== 272 (16 direct, 256 indirect) bytes in 1 blocks are definitely lost in loss record 8 of 12
==23800== at 0x4C2260E: malloc (vg_replace_malloc.c:207)
==23800== by 0x4024BD: enqueue(bplus.c:98)
==23800== by 0x40260A: PrintBplus (bplus.c:202)
==23800== by 0x40286F: main (bplus.c:1251)
==23800==
这里enqueuenode
是结构的指针,它将两个enqueue
作为头节点和尾节点。这是用于在出队期间遍历队列。每个queue
都是结构的指针,它包含一些需要排队的节点地址。
答案 0 :(得分:5)
这是您分配丢失的内存的地方。
Valgrind无法报告您丢失的位置,它只能跟踪分配和解除分配。
也许你在一个算法中丢失了一些节点,这些节点应该很容易测试,因为节点数量会减少,但是代码中也可能存在释放数据结构的错误。
答案 1 :(得分:0)
有没有理由为enqueue
指针指定一个大小适合enqueuenode
的内存块?
[98] -> enqueue *queue=NULL;
queue = malloc(sizeof(enqueuenode));
正如您所说,enqueuenode
包含两个enqueue
,第二个可能是您遗失的记忆。