Я недавно удалось получить переполнение стека при уничтожении дерева, удалив его корень «узел», в то время как узел деструктор похож на это:Исключение разрушения свободное дерево в C++
Node::~Node(){
for(int i=0;i<m_childCount;i++)
delete m_child[i];
}
Раствор, которые приходят я решил использовать собственный стек. Таким образом, удаление дерева таким образом:
std::stack< Node* > toDelete;
if(m_root)
toDelete.push(m_root);
while(toDelete.size()){
Node *node = toDelete.top();
toDelete.pop();
for(int i=0;i<node->GetChildCount();i++)
toDelete.push(node->Child(i));
delete node;
}
Но там std :: stack :: push() может вызывать исключение. Можно ли написать исключение? Как?
EDIT:
Если кто-то заинтересован здесь исключение бесплатно нерекурсивна код вдохновленный алгоритма указывал jpalecek:
Node *current = m_root;
while(current){
if(current->IsLeaf()){
delete current;
return;
}
Node *leftMostBranch = current;// used to attach right subtrees
// delete all right childs
for(size_t i=1; i<current->GetChildCount(); i++){
while(!leftMostBranch->Child(0)->IsLeaf())
leftMostBranch = leftMostBranch->Child(0);
delete leftMostBranch->Child(0);
leftMostBranch->Child(0) = current->Child(i);
}
// delete this node and advance to the left child
Node *tmp = current;
current = current->Child(0);
delete tmp;
}
примечание: Node::IsLeaf()
эквивалентно Node::GetChildCount()!=0
.
Вы протестировали, если ваше дерево действительно (оно не образует петли и не повреждено каким-либо образом)? Сколько уровней стека спустилось до того, как он разбился? – rwong
Чтобы проверить правильность вашего дерева (при исследовании проблемы), выполните обход дерева (в порядке, предзаказ или пост-порядок) и посмотрите, идет ли он в бесконечный цикл. – rwong
Как указано в другом примечании, проблема заключается не в валидности дерева, а в переполнении стека, вызванной рекурсивным вызовом Node :: ~ Node(). –