これが私のNodeクラスです。
class Node
{
private:
public:
T data;
Node<T>* left;
Node<T>* right;
Node(T dat) : data(dat), left(NULL), right(NULL)
{}
};
Btree クラスで定義された挿入関数は次のとおりです。
public:
Node<T>* root;
Btree() : root(NULL){}
void insert(T data, Node<T>* parent)
{
if( !parent )
{
parent = new Node<T>(data);
return;
}
else if(data < parent->data)
{
insert(data, parent->left);
}
else if(data > parent->data)
{
insert(data, parent->right);
}
}
};
これが私の主な機能です:
int main()
{
Btree<int> tree;
tree.insert(5, tree.root);
cout << tree.root->data << endl;
tree.insert(6, tree.root);
cout << tree.root->right->data << endl;
}
実行すると、セグフォルトが発生します。
ポインター変数の親が値渡しされているためだと思うので、親が指す新しいノードを作成すると、挿入関数を終了すると失われますか? ここでダブルポインターを使用する必要があるということですか?
これが計画どおりに機能しない原因となっているメモリ内で何が起こっているかについて、誰かが完全な説明をしてくれませんか。ここで私の診断は正しいですか、それとも他に何か問題がありますか?
挿入する 2 番目のパラメーターとして tree.root を渡すと、Node* が渡されます。さて、値で渡されたとしても、呼び出し元のメイン関数から渡したアドレスと同じではないでしょうか。したがって、parent (メインの tree.root から渡したアドレス) = new Node と言うと、ヒープ上に、parent のアドレス、別名 tree.root のアドレスに新しい Node を作成するべきではありませんか? なぜ値渡しがこれを混乱させるのですか?