Как создать конструктор Quadtree Copy с рекурсией

Я работаю над конструктором копирования для Quadtree. Вот что у меня есть до сих пор:

    //Copy Constructor
    Quadtree :: Quadtree(const Quadtree & other)
    {
    root = copy(other.root);
    resolution = other.resolution;
    }

   //Copy Constructor helper function
    Quadtree::QuadtreeNode *Quadtree :: copy (const QuadtreeNode* newRoot)
    { 
    if (newRoot != NULL)
    {
        QuadtreeNode *node = new QuadtreeNode(newRoot->element);
        node->nwChild = copy(newRoot->nwChild);
        node->neChild = copy(newRoot->neChild);
        node->swChild = copy(newRoot->swChild);
        node->seChild = copy(newRoot->seChild);

        return node;    
    }
    else
        return NULL; 
     }

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

В приложении моя функция buildTree, где я фактически создаю дерево. Может я тут что-то не так делаю?

    void Quadtree :: buildTree (PNG const & source, int theResolution)
    {
        buildTreeHelp (root, 0, 0, theResolution, source);  
    }

   void Quadtree :: buildTreeHelp (QuadtreeNode * & newRoot, int xCoord, int yCoord, int d, PNG const & image)
    {
       if (d == 1)
       {
            RGBAPixel pixel = *image(xCoord, yCoord);
            newRoot = new QuadtreeNode(pixel);
            return; 
       }
        newRoot = new QuadtreeNode ();
        newRoot = NULL;

            buildTreeHelp(newRoot->nwChild, xCoord, yCoord, d/2, image);
        buildTreeHelp(newRoot->neChild, xCoord + d/2, yCoord, d/2, image);
        buildTreeHelp(newRoot->swChild, d/2, yCoord + d/2, d/2, image);
        buildTreeHelp(newRoot->seChild, d/2 + xCoord, d/2 + yCoord, d/2, image);
    }

person Community    schedule 18.03.2013    source источник
comment
Можете ли вы опубликовать небольшой полный пример? Предоставленный вами код недостаточно свидетельствует об утечке памяти или неинициализированном доступе.   -  person Drew Dormann    schedule 18.03.2013
comment
Я добавил функцию buildTree, которая фактически строит дерево. Возможно, что-то не так в том, как я инициализировал дерево?   -  person    schedule 18.03.2013


Ответы (1)


Я думаю, что утечка памяти лежит здесь:

    newRoot = new QuadtreeNode ();
    newRoot = NULL;

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

    buildTreeHelp(newRoot->nwChild, xCoord, yCoord, d/2, image);

Вы, вероятно, выиграете от использования интеллектуального указателя, такого как std::unique_ptr, для управления памятью вместо использования необработанных вызовов new и delete.

person Andrew Durward    schedule 18.03.2013