以下C代码中的内存丢失

以下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;

在下面的排队代码中,我得到了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;
以下是两种结构

         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;