![](/img/trans.png)
[英]what is difference between allocating pointer object by the following 2 ways?
[英]What's the difference between ways in assigning a pointer?
感谢您查看我的问题。 我刚刚在实现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;
}
使用第一种方式(注明的一种),该函数不会分配等于节点的树,而第二种方式可以正常工作。
那么,这是我的错写,还是他们自然不同?
不,这两种方式不应该相同:
p = &q
是完全有效的,因为q
是内存中的实际对象, p
是指向它的指针 p = q
分配一个未初始化指针q
到p
,这是未定义的行为。 这就是为什么这两种实现方式不同。
如果要将q
分配给p
,则需要首先分配q
本身。 例如,您可以为其分配new int
:
int *p, *q = new int;
p = q;
但是,在这种情况下,您也可以将new int
直接分配给p
。
请注意第一种情况:
// 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
函数返回,其堆栈帧就会被激活,并且所有局部变量/对象都将变为无效,因此,您将遇到内存错误。
int *p, q;
p = &q;
这意味着p现在具有整数q存储在存储器中的地址。
int *p, *q;
p = q;
在此,您将指针q中存储的地址复制到p。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.