【发布时间】:2010-12-04 19:32:49
【问题描述】:
我正在做(类似的事情):
void insert(Node*& node, string val, Node* parent)
{
if (node == NULL)
instantiateNode(node, val, parent);
else
insert(node->child, val, node);
}
问题是,instantiateNode(..., parent) 似乎修改了在设置*parent 时传递给函数的原始*&node。 instantiateNode()应该改变node,但如果它改变parent,那么你有一个节点被设置为它的父节点,这没有意义,也没有不工作。完全没有。
我完全关心指针引用的原因是因为它消除了特殊情况并显着减少了我必须做的错误检查量。由于我这样做是为了减少行数和琐碎的算法重复,因此我可以通过将代码行数增加大约一倍来解决这个问题。但我宁愿不这样做,而且我觉得 应该 有一种方法可以取消引用指针引用以获取指向同一对象的新指针。而且,真的,我认为 *&node 到 *parent 的传递应该可以做到,但显然 gcc 正在优化它。
【问题讨论】:
-
您能否发布您的完整代码以及您想要实现的目标是什么?这看起来是一个相当简单的插入,为什么还要处理指针引用?
-
您的问题听起来不清楚。为什么不发布实例化节点?它应该修改节点指针(并且整个事情也应该能够修改父节点)对我来说似乎是可以预期的。
-
目前尚不清楚(至少对我而言)您正在寻找的代码 sn-p 的行为变化是什么。我假设将
node作为参考传递的全部意义在于它可以从函数内部进行修改。此外,函数名称instantiateNode似乎暗示它将创建一个新节点,可能是通过修改它的参数。关于复制指针,你的意思是Node *copy = node;? -
"显然 gcc 正在优化它" -> 不,不是。不要责怪编译器/优化器。它几乎从不出错,而且 GCC 出错的频率甚至比大多数都少。您的代码正在执行您告诉它的操作,这可能是也可能不是您想要的。
-
我应该在我之前的评论中添加不允许优化器更改程序的行为方式。只有在最奇怪的情况下(未定义的行为、优化器错误以及规范中的一些事情,如赋值/复制构造函数省略)才会这样做。
标签: c++ reference pointers dereference