【发布时间】:2016-06-02 03:15:51
【问题描述】:
感谢您检查我的问题,我目前有一个关于运算符“delete”的非常基本的问题,它似乎可以自动将指针值更改为 nullptr。让我给你一个例子:
template <typename T>
void Tree<T>::remove(const unsigned& index, TreeNode<T>*& tree)
{
if(tree == nullptr)
{
std::cerr << "remove: can't find target" << std::endl;
}
else if(index < tree->index)
{
remove(index, tree->left);
}
else if(index > tree->index)
{
remove(index, tree->right);
}
else if(index == tree->index)
{
if(tree->degree() == 2)
{
tree->index = findMin(tree->right)->index;
tree->value = findMin(tree->right)->value;
remove(tree->index, tree->right);
}
else
{
auto oldNode = tree;
tree = (tree->left != nullptr) ? tree->left: tree->right;
delete oldNode;
// oldNode = nullptr;
}
}
}
上面的代码是一个经典的搜索树移除算法。如果当前树只有两个节点,即根节点(例如 key 等于 3)和右子节点(例如 key 等于 4),那么当我删除节点 4 时,它会调用 remove 两次并转到这一行:
delete oldNode;
这一行将删除“oldNode”,现在应该是 4。据我所知,删除操作符只会释放内存地址(地址与 oldNode 的值相同),这意味着它告诉操作系统该地址再次可用。所以我想当我打印出root的右指针(root->right)的值时,我应该得到一个地址。实际上,当我打印出来时,我得到了 0。所以当 root->right 改变时我的问题是什么?
希望我能清楚地解释我的问题。这可能是一个愚蠢的问题,如果我有任何混淆,请告诉我。
【问题讨论】:
标签: c++ data-structures