2016-06-08 6 views
1

Когда я запустить деструктор я получаю пробег не удался, и я не знаю, почему здесь моего дерево заголовокс деструктором ++ для двоичного дерева

class ExpressionTree { 
private: 
    ExpressionNode* root; 
public: 
    ExpressionTree() : 
    hashmap(100000), 
    root(NULL) { 
    }; 
    virtual ~ExpressionTree(){ 
     helper(root); 
    } 

    void helper(ExpressionNode *node) { 
     if (!node) { 
      return; 
     } else { 
      helper(node->getLeft()); 
      helper(node->getRight()); 
      delete node; 
     } 
    } 
}; 

и заголовок моего узла

class ExpressionNode { 
private: 
    ExpressionNode* left; 
    ExpressionNode* right; 
    string data; 
public: 
    virtual ~ExpressionNode(){ 
     delete left; 
     delete right; 
    } 
}; 

Теперь все отлично работает, если в классе ExpressionTree я уничтожаю только корень, но я считаю, что я утечка памяти таким образом. Это на самом деле правильный путь или что-то не так с моим рекурсивным разрушением.

+1

Вы удаляете память дважды. Не делай этого! И инициализируйте ваши указатели на 'nullptr', иначе вы попытаетесь удалить случайную память. – tkausl

ответ

6

Деструктор ExpressionNode надлежащим образом очищает память, потому что он уничтожает его детей, которые должным образом очищают память и так далее. То, что вы делаете прямо сейчас, - это двойное освобождение узлов; один раз - helper() и один раз самими деструкторами. Все, что вам нужно сделать, это уничтожить корневой узел

virtual ~ExpressionTree(){ 
    delete root; 
} 

все дочерние узлы будут удалены через деструкторы.

 Смежные вопросы

  • Нет связанных вопросов^_^