感谢您检查我的问题。在实现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;
}
使用第一种方法(注解),该函数不会将树分配给等于节点的树,而第二种方法可以正常工作。
那么,这是我的错写的,还是天生就不同?
最佳答案
请注意第一种情况:
// TreeNode<T> node(value, key);
// if(tree == nullptr) tree = &node;
node
是在堆栈上分配的对象。而在第二种情况下
TreeNode<T> *node = new TreeNode<T>(value, key);
if(tree == nullptr) tree = node;
node
分配在堆上。区别在于,一旦
_insert
函数返回,将弹出其堆栈框架,并且所有局部变量/对象都将变为无效,因此,您将遇到内存错误。关于c++ - 分配指针的方式之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37872194/