バイナリ ツリーをテストするプログラムを作成しましたが、実行するとプログラムがクラッシュするようです (btree.exe が動作を停止し、Windows が解決策を確認しています ...)。
デバッガーで実行し、原因と思われる関数 destroy_tree() にブレークポイントを設定すると、期待どおりに実行され、メイン関数に戻りました。Main はプログラムから戻りましたが、カーソルは destroy_tree() に戻り、再帰的にループしました。
最小限のコード サンプルを以下に示しますので、すぐに実行できます。私のコンパイラは MinGW で、デバッガは gdb です (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;
}
余談ですが、これらの問題をデバッグするために、Code::Blocks 組み込みデバッガーから DDD に切り替える予定です。DDD は、ポインターのアドレスを表示するだけでなく、オブジェクトへのポインターを視覚的に表示できると聞きました。このような問題 (データ構造やアルゴリズムの問題) の解決に、切り替えが役立つと思いますか?