謝謝你檢查我的問題。當我實施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;
}
使用第一種方法(注意一個),該函數將不分配樹等於節點,而第二種方式工作正常。
那麼,這是我寫的錯,還是他們自然不同?
謝謝你的迴應,真的很感激。所以,如果我理解正確,我得到錯誤的原因是因爲在堆中聲明的變量超出範圍時將被釋放,所以,在第一種情況下,「節點」將被釋放並且指針「樹」將被重置爲「nullptr」,對嗎? –
@XiangyuZhang不,在堆中分配的內存不會被釋放,除非你明確這樣做(這就是爲什麼你在第二種情況下沒有問題)。對於第一種情況,一旦_insert的棧幀被彈出,指針「tree」將不會被重置爲「nullptr」,它仍然保持原來的狀態,但是因爲_insert()已經返回,所以「tree」指向只是隨機存儲器(以下函數調用的堆棧框架將覆蓋已分配的堆棧存儲器),解引用/訪問「樹」指針肯定會產生問題。 –
@ XgygyuZhang也許這對於查看https://en.wikipedia.org/wiki/Call_stack#STACK-FRAME很有幫助 –