valgrind показывает утечки памяти.как мне остановить утечку? - PullRequest
0 голосов
/ 23 февраля 2019

Я новичок в valgrind, и я запустил его с кодом, который я написал для дерева квадрантов.

Я написал функцию, которая рекурсивно освобождает узлы от дерева дерева:

void destroyTree (Node* p)
{
    if (!p) return;

    for (size_t i = 0; i < 4; ++i)
        destroyTree(p->child[i]);

    free(p);
}

Я вызываю эту функцию в основной функции:

int main( int argc, char **argv ) {

  Node *head;

  // make the head node
  head = makeNode( 0.0,0.0, 0 );

  // make a tree
  makeChildren( head );
  makeChildren( head->child[0] );
  makeChildren( head->child[1] );
  makeChildren( head->child[2] );
  makeChildren( head->child[3] );

  // print the tree for Gnuplot
    writeTree( head );
  return 0;

  //destroy tree
  destroyTree (head);
  return 0;
}

Когда я запускаю valgrind, это показывает, что я теряю часть памяти.

Структура:

struct qnode {
  int level;
  double xy[2];
  struct qnode *child[4];
};
typedef struct qnode Node;

Я вызываю malloc в buildTree:

Node *makeNode( double x, double y, int level ) {

  int i;

  Node *node = (Node *)malloc(sizeof(Node));

  node->level = level;

  node->xy[0] = x;
  node->xy[1] = y;

  for( i=0;i<4;++i )
    node->child[i] = NULL;

  return node;
}

Как мне остановить утечку?Что-то не так с моей функцией освобождения или это где-то еще?

valgrind memory leak

1 Ответ

0 голосов
/ 23 февраля 2019

хорошо, поскольку никто не заметил этого, конец main гласит:

  // print the tree for Gnuplot
    writeTree( head );
  return 0;    // <----------- wooooot!

  //destroy tree
  destroyTree (head);
  return 0;
}

Мы заметили, что 2 последние строки недостижимы, потому что чуть выше этого есть оператор return 0.Поэтому метод destroyTree никогда не вызывается, что объясняет утечку памяти.

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

Тем не менее, даже -Wall -Wextra здесь не работает, флаг -Wunreachable-code должен быть добавлен явно ( Почему GCC непредупредить о недоступном коде? )

...