Ich schrieb ein Programm, um meinen Binärbaum zu testen und wenn ich es ausführe, scheint das Programm abzustürzen (btree.exe funktioniert nicht mehr, Windows sucht nach einer Lösung ...).segfault nach Rückgabe 0;
Als ich es durch meinen Debugger lief und den Haltepunkt auf die Funktion platzierte, die ich vermute, verursacht es, destroy_tree(), schien es wie erwartet zu laufen und kehrte zur Hauptfunktion zurück. Main, wiederum, kehrte aus dem Programm, aber dann sprang der Cursor zurück zu destroy_tree() und rekursiv in sich geschleift.
Das minimale Codebeispiel ist unten, so dass es sofort ran werden kann. Mein Compiler ist MinGW und mein Debugger ist Gdb (ich verwende Code :: Blocks).
#include <iostream>
using namespace std;
struct node
{
int key_value;
node *left;
node *right;
};
class Btree
{
public:
Btree();
~Btree();
void insert(int key);
void destroy_tree();
private:
node *root;
void destroy_tree(node *leaf);
void insert(int key, node *leaf);
};
Btree::Btree()
{
root = NULL;
}
Btree::~Btree()
{
destroy_tree();
}
void Btree::destroy_tree()
{
destroy_tree(root);
cout<<"tree destroyed\n"<<endl;
}
void Btree::destroy_tree(node *leaf)
{
if(leaf!=NULL)
{
destroy_tree(leaf->left);
destroy_tree(leaf->right);
delete leaf;
}
}
void Btree::insert(int key, node *leaf)
{
if(key < leaf->key_value)
{
if(leaf->left!=NULL)
insert(key, leaf->left);
else
{
leaf->left = new node;
leaf->left->key_value = key;
leaf->left->left = NULL;
leaf->left->right = NULL;
}
}
else if (key >= leaf->key_value)
{
if(leaf->right!=NULL)
insert(key, leaf->right);
else
{
leaf->right = new node;
leaf->right->key_value = key;
leaf->right->left = NULL;
leaf->right->right = NULL;
}
}
}
void Btree::insert(int key)
{
if(root!=NULL)
{
insert(key, root);
}
else
{
root = new node;
root->key_value = key;
root->left = NULL;
root->right = NULL;
}
}
int main()
{
Btree tree;
int i;
tree.insert(1);
tree.destroy_tree();
return 0;
}
Als beiseite, ich bin der Planung für das Debuggen, diese Probleme von Code :: Blocks integrierten Debugger auf DDD wechseln. Ich habe gehört, DDD kann visuelle Zeiger auf Objekte anzeigen, anstatt nur die Adresse des Zeigers anzuzeigen. Denken Sie, dass die Umstellung die Lösung dieser Art von Problemen (Probleme mit Datenstrukturen und Algorithmen) erleichtert?
Danke, ich habe vergessen, dass die lokalen Destruktoren aufgerufen werden, wenn der Haupt kehrt – Steve
kühlen. Obwohl ich vorschlagen möchte, dass Sie alles auf NULL zurücksetzen, ist es eine gute Programmierpraxis. – PaV