分配指针的方法有什么区别?

Xia*_*ang 6 c++

感谢您查看我的问题.我刚刚在实现BST时遇到了一个非常根本的问题,那就是"分配指针的不同方法有什么区别?" 我们都知道分配一个点可以使用:

int *p, q;
p = &q;
Run Code Online (Sandbox Code Playgroud)

要么:

int *p, *q;
p = q;
Run Code Online (Sandbox Code Playgroud)

它们应该是一样的.但在我的情况下,他们的工作完全不同:

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;
}
Run Code Online (Sandbox Code Playgroud)

使用第一种方式(注明的一种),该函数不会分配等于节点的树,而第二种方式可以正常工作.

那么,这是我的错写,还是他们自然不同?

Lei*_*Mou 3

第一种情况请注意:

//  TreeNode<T> node(value, key);
//  if(tree == nullptr) tree = &node;
Run Code Online (Sandbox Code Playgroud)

node是在堆栈上分配的对象。

而在第二种情况下

TreeNode<T> *node = new TreeNode<T>(value, key);
if(tree == nullptr) tree = node;
Run Code Online (Sandbox Code Playgroud)

node分配在堆上

不同之处在于,一旦_insert函数返回,其堆栈帧就会弹出,并且所有局部变量/对象都将变得无效,因此,您将出现内存错误。