gpt4 book ai didi

c++ - 分配指针的方式有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:19 25 4
gpt4 key购买 nike

感谢您检查我的问题。我在实现 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函数返回,它的栈帧就会被弹出,所有的局部变量/对象都会失效,结果会出现内存错误。

关于c++ - 分配指针的方式有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37872194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com