以下C代码中的内存丢失
在下面的排队代码中,我得到了16字节的内存丢失。你能告诉我怎样才能解决这个问题吗?代码是:以下C代码中的内存丢失,c,memory-leaks,valgrind,C,Memory Leaks,Valgrind,在下面的排队代码中,我得到了16字节的内存丢失。你能告诉我怎样才能解决这个问题吗?代码是: void enqueue( enqueuenode * queueNode1 ,bplus *bplusNew){ [98] -> enqueue *queue=NULL; queue = malloc(sizeof(enqueue_node)); queue->bplus = bplusNew;
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;
以下是两种结构
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输出:
typedef struct enqueue_help{
bplus bplusNode;
struct enqueue_help * next;
}*enqueue,enqueue_node;
typedef struct enqueuenode_help{
enqueue headNode;
enqueue tailNode;
}*enqueuenode,enqueuenode_node;
=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
作为头节点和尾节点。这用于在排队过程中遍历队列。每个队列
都是结构的指针,该结构包含一些需要排队的节点地址。这是分配丢失内存的位置
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无法报告丢失的位置,它只能跟踪分配和解除分配
typedef struct enqueue_help{
bplus bplusNode;
struct enqueue_help * next;
}*enqueue,enqueue_node;
typedef struct enqueuenode_help{
enqueue headNode;
enqueue tailNode;
}*enqueuenode,enqueuenode_node;
可能在某个算法中丢失了一些节点,这应该很容易测试,因为节点的数量减少了,但也可能是代码中存在释放数据结构的错误。这是分配丢失内存的地方
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无法报告丢失的位置,它只能跟踪分配和解除分配
typedef struct enqueue_help{
bplus bplusNode;
struct enqueue_help * next;
}*enqueue,enqueue_node;
typedef struct enqueuenode_help{
enqueue headNode;
enqueue tailNode;
}*enqueuenode,enqueuenode_node;
可能您在某个算法中丢失了一些节点,由于节点数量减少,测试起来应该很容易,但也可能是代码中存在释放数据结构的错误。是否有原因为指向
排队
的指针分配了一个大小与排队节点
对应的内存块
typedef struct enqueue_help{
bplus bplusNode;
struct enqueue_help * next;
}*enqueue,enqueue_node;
typedef struct enqueuenode_help{
enqueue headNode;
enqueue tailNode;
}*enqueuenode,enqueuenode_node;
[98] -> enqueue *queue=NULL;
queue = malloc(sizeof(enqueuenode));
如果,如您所说,
enqueuenode
包含两个enqueue
,则第二个可能是您缺少的内存。是否有理由为指向enqueue
的指针分配一个大小为enqueuenode
的内存块
typedef struct enqueue_help{
bplus bplusNode;
struct enqueue_help * next;
}*enqueue,enqueue_node;
typedef struct enqueuenode_help{
enqueue headNode;
enqueue tailNode;
}*enqueuenode,enqueuenode_node;
[98] -> enqueue *queue=NULL;
queue = malloc(sizeof(enqueuenode));
如果,如您所说,
enqueuenode
包含两个enqueue
,则第二个可能是您缺少的内存。这就是整个函数吗?您确定随后要释放在此分配的节点吗?我认为问题不在该函数中。它必须是您的程序中进行解除分配的位置。应该有问题。这里报告内存丢失是因为它是保留的。如何将排队
,排队节点
和排队节点
关联?@Oli-enqueue\u节点是类型。我编辑了一个。关于拼写错误和混乱,你肯定是在自找麻烦,因为有了排队节点和排队节点。我以前见过这种模式,其中为指向结构的指针定义了不同的名称,但对我来说,每次我看到它时,这似乎都是一个坏主意-您已经可以看到您在处理指针时,没有不同的名称。您不能只命名结构enqueue和enqueue_节点吗。如果您需要指向其中一个的指针,只需使用enqueue和enqueue_node*,这就是全部函数吗?您确定随后要释放在此分配的节点吗?我认为问题不在该函数中。它必须是您的程序中进行解除分配的位置。应该有问题。这里报告内存丢失是因为它是保留的。如何将排队
,排队节点
和排队节点
关联?@Oli-enqueue\u节点是类型。我编辑了一个。关于拼写错误和混乱,你肯定是在自找麻烦,因为有了排队节点和排队节点。我以前见过这种模式,其中为指向结构的指针定义了不同的名称,但对我来说,每次我看到它时,这似乎都是一个坏主意-您已经可以看到您在处理指针时,没有不同的名称。您不能只命名结构enqueue和enqueue_节点吗。如果您需要指向其中一个的指针,只需使用enqueue和enqueue_node*我还有其他损失,比如间接损失,仍然可以访问。这是唯一肯定的损失,你认为,这肯定的损失是由于其他损失吗?我应该先解决其他问题吗?我们会解决所有问题,可能是先解决这个问题。。您知道队列*丢失了,如果您懒得重新读取和验证所有代码,只需跟踪(打印)分配并在运行代码时释放,问题所在的位置应该是可见的。我还有其他损失,如间接损失,仍然可以访问。这是唯一肯定的损失,你认为,这肯定的损失是由于其他损失吗?我应该先解决其他问题吗?我们会解决所有问题,可能是先解决这个问题。。您知道队列*已丢失,如果您懒得重新读取和验证所有代码,只需跟踪(打印)分配并在运行代码时释放,那么问题所在的位置应该是可见的。再次抱歉,输入错误。我没有复制并粘贴代码。所以我犯了一些错误。Enqueue是结构Enqueue_节点的指针,enqueuenode是结构enqueuenode_节点的指针。此enqueuenode_节点包含两个用于Enqueue_节点的指针。这就是我不喜欢typedef
的原因;-)我添加了这些结构。我希望这会使你更清楚地再次拼写错误。我没有复制并粘贴代码。所以我犯了一些错误。Enqueue是结构Enqueue_节点的指针,enqueuenode是结构enqueuenode_节点的指针。此enqueuenode_节点包含两个用于Enqueue_节点的指针。这就是我不喜欢typedef
的原因;-)我添加了这些结构。我希望这会让你更清楚
typedef struct enqueue_help{
bplus bplusNode;
struct enqueue_help * next;
}*enqueue,enqueue_node;
typedef struct enqueuenode_help{
enqueue headNode;
enqueue tailNode;
}*enqueuenode,enqueuenode_node;