感谢您检查我的问题。在实现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/

10-11 23:08
查看更多