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

What's the difference between ways in assigning a pointer?

本文关键字:什么 区别 之间 指针 方法 分配      更新时间:2023-10-16

谢谢您检查我的问题。当我实施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是分配在 stack 上的对象。

在第二种情况下

TreeNode<T> *node = new TreeNode<T>(value, key);
if(tree == nullptr) tree = node;

node分配在 HEAP 上。

区别在于,一旦_insert函数返回,其堆栈框架就会弹出,并且所有局部变量/对象变得无效,因此您将有内存错误。

no,两种方式不应相同:

  • 第一个分配p = &q是完全有效的,因为q是内存中的实际对象,而p是指向它的指针
  • 第二个任务p = q将一个统一的指针q分配给p,这是不确定的行为。

这就是两个实现不同的原因。

如果您想将q分配给p,则需要先分配q本身。例如,您可以将new int分配给它:

int *p, *q = new int;
p = q;

但是,在这种情况下,您可以直接将new int分配给p

int *p, q;
p = &q;

这意味着P现在具有整数Q存储在内存中的地址。

int *p, *q;
p = q;

在此中,您将存储在指针Q中的地址复制到第p。