簡體   English   中英

以下C代碼中的內存丟失

[英]memory loss in the following C code

我在下面的代碼排隊中得到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都是結構的指針,該結構包含一些需要排隊的節點地址。

在這里分配丟失的內存。

Valgrind無法報告丟失的位置,它只能跟蹤分配和釋放。

也許您丟失了一種算法中的某些節點,由於節點數減少,因此應該很容易測試,但是代碼中有可能會釋放數據結構的錯誤。

為什么要給指向enqueue的指針分配一個大小為enqueuenode的內存塊,這是有原因的嗎?

  [98] -> enqueue *queue=NULL;
          queue = malloc(sizeof(enqueuenode));

如您所說,如果enqueuenode包含兩個enqueue ,則第二個可能是您缺少的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM