потеря памяти в следующем C-коде - PullRequest
0 голосов
/ 18 августа 2011

Я получаю потерю памяти в 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 является указателем на структуру, которая содержит некоторый адрес узла, который должен быть поставлен в очередь.

Ответы [ 2 ]

5 голосов
/ 18 августа 2011

Здесь вы распределили потерянную память.

Valgrind не может сообщить, где вы потеряли его, он может только отслеживать распределения и освобождения.

Возможно, вы потеряете некоторые узлы в одном из ваших алгоритмов, что должно быть легко проверить, так как количество узлов уменьшается, но также возможно, что в коде есть ошибка, которая освобождает структуру данных.

0 голосов
/ 18 августа 2011

Есть ли причина, по которой указателю на enqueue назначается блок памяти, размер которого соответствует enqueuenode?

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

Если, как вы говорите, enqueuenode содержит два enqueue, вторым может быть память, которую вам не хватает.

...