2011-08-18 21 views
0

我得到16字節的記憶喪失在下面的代碼排隊。你能不能讓我知道如何擺脫這個問題?的代碼是:記憶力減退下面的C代碼

 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; 
       } 
      } 

以下是兩個strucutres

  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是一個指針,用於保存某些需要排隊的節點地址的結構。

+1

這是整個功能嗎?你確定隨後釋放你在這裏分配的節點嗎? –

+2

我不認爲問題在於這個功能。它必須是您的程序中釋放資源的地方。應該有問題。這裏記錄的內存丟失是因爲它是保留的地方。 –

+0

'enqueue','enqueuenode'和'ENQUEUE_NODE'如何關聯? –

回答

5

這是你分配的失去的記憶。

Valgrind的不能報,你失去了它,它只能跟蹤分配和釋放。

也許你在其中一個算法中丟失了一些節點,由於節點數量減少了,應該很容易測試,但是也可能在代碼中存在一個釋放數據結構的錯誤。

+0

我還有其他的損失,如**間接損失,仍可達**。這是唯一的**絕對失去了**,你認爲,這是**確定失去**是由於其他損失?我應該先去解決別人嗎? – thetna

+0

很好地解決了所有這些問題,可能這是第一個..你知道一個入隊*丟失了,如果你懶得重新讀取和驗證你的代碼只是在運行你的代碼時跟蹤(打印)分配和釋放,它應該在問題出現的地方可見。 –

0

有爲什麼指針enqueue分配多數民衆贊成尺寸爲enqueuenode一個內存塊的一個原因?

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

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

+0

抱歉錯字錯誤。我沒有複製和粘貼代碼。所以有一些錯誤。 Enqueue是結構的指針** enqueue_node **和** enqueuenode **是結構的指針** enqueuenode_node **。** enqueuenode_node **包含兩個指針** enqueue_node **。 – thetna

+0

這就是爲什麼我不喜歡'typedef'的;-) –

+0

我已經添加了這些結構。我希望這會讓你更清楚 – thetna