私の質問を確認していただきありがとうございます。私はBSTを実装しているときに本当に基本的な問題に遭遇しました。つまり、「ポインタを割り当てるさまざまなアプローチの違いは何ですか?」ポインタを割り当てる方法の違いは何ですか?
int *p, q;
p = &q;
かを:我々は、すべてのポイントを使用することができます割り当てる知っ
int *p, *q;
p = q;
彼らは同じでなければなりません。しかし、下の私の場合、彼らは全く別の作業:
最初の方法を使用してtemplate <typename T>
void Tree<T>::_insert(TreeNode<T>*& tree, const T& value, const unsigned& key)
{
// TreeNode<T> node(value, key);
// if(tree == nullptr) tree = &node;
TreeNode<T> *node = new TreeNode<T>(value, key);
if(tree == nullptr) tree = node;
else if(key < tree->index) _insert(tree->left, value, key);
else if(key > tree->index) _insert(tree->right, value, key);
else if(key == tree->index) std::cerr << "_insert: repeating key" << std::endl;
}
第二の方法は、正常に動作している間(1を指摘)、関数は、ノードと同じツリーを割り当てることはありません。
これは私の間違いですか、それとも自然に違うのですか?
ありがとう、本当にありがとうございます。だから私が正しく理解していると、エラーが出る理由は、ヒープで宣言された変数がスコープを超えたときに解放されるためです。したがって、最初のケースでは、「ノード」は解放され、ポインタ「ツリー」は"nullptr"、そうですか? –
@XiangyuZhangいいえ、ヒープに割り当てられたメモリは、明示的にそうしなければ解放されません(そのため、2番目のケースで問題がなかったのです)。最初のケースでは、_insertのスタックフレームがポップされると、ポインタ "tree"は "nullptr"にリセットされません。それは元のままですが、_insert()が返されたので、 "tree" (以下の関数呼び出しのスタックフレームは割り当てられたスタックメモリを上書きします)、 "ツリー"ポインタの逆参照/アクセスは確かに問題になります。 –
@XiangyuZhangたぶんhttps://en.wikipedia.org/wiki/Call_stack#STACK-FRAMEを見ると便利です –