2016-04-01 4 views
-2

Я реализую алгоритм кубирования звезд для агрегации данных в C++ (я новичок в C++). В этом алгоритме мы имеем большие данные. На первом этапе мы строим базовое дерево, используя все данные, а затем на основе базового дерева мы должны строить другие деревья, называемые звездными деревьями, после того, как каждое звездное дерево завершено, его значения выводятся, а звездное дерево должно быть уничтожено. Я сделал весь этот процесс, мой алгоритм работает, но его использование памяти очень много, и кажется, что эти звездные деревья не уничтожены. Ниже часть моего кода, я думаю, что это полезно для этой проблемы:Почему я не могу удалить созданные деревья?

Для каждого дерева, которое я намерен уничтожить, я передаю его корень destroyTree (узел * корень) метод:

void Cagg::destroyTree(node* root){ 
    int size = root->child.size(); 
    for (int i = 0; i < size; i++){ 
     destroyTree(root->child[i]); 
    } 
    delete root; 
    root = NULL; 

}

при отладке, кажется, узел удален, но использование памяти в программе растет экспоненциально, в то время как программа создает больше звездных деревьев, а это значит, что они не уничтожены. Более того, деструктор пуст. Я просто удаляю узлы в этом методе. Заранее благодарим вас за помощь.

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

+0

Ничего страшного здесь не происходит. Я бы посмотрел в другом месте на утечку. И я бы также посмотрел на хранение узлов, а не на указатели на узлы. Почему все-таки мирились с ручным управлением памятью? Если это доступно в вашей ОС, посмотрите на то, чтобы дать Valgrind удар при обнаружении утечки. – user4581301

+0

Я никогда не слышал об этом. (Я действительно новый;)). Я просто ищу его. Кажется, valgrind для unix os, я прав? Я использую окна. У вас есть какие-либо предложения для окон? Спасибо – sahar

+0

Ничего из того, что я достаточно знаком, чтобы рекомендовать. Вот серое сообщение о замене Windows: http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows – user4581301

ответ

1

Ничто здесь не будет утечки памяти, но вам не нужна явная рекурсия. Все, что вам нужно это:

node::~node() 
{ 
    while (size() > 0) { 
     delete child[size()-1]; 
    } 
} 

и delete root; где-то.

+0

не работает, я добавляю 2 строки в конец моего вопроса, не могли бы вы также прочитать это. Может быть, полезно найти ошибку. – sahar

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