【发布时间】:2015-12-08 17:21:59
【问题描述】:
考虑以下函数,如果该节点没有子节点,则从二叉搜索树中删除该节点:
void erase_no_children(node* todel)
{
//...
if (todel->parent->left == todel) //if todel is left child
todel->parent->left = nullptr;
if (todel->parent->right == todel) //if todel is right child
todel->parent->right = nullptr;
delete todel;
}
因为todel->parent->left == todel 这意味着通过将todel->parent->left 设置为nullptr,我也可以将todel 设置为nullptr。编译器一点也不抱怨。
问题:这样做安全吗?它会泄漏吗?还是未定义的行为?
【问题讨论】:
-
您没有将
todel设置为nullptr。 -
不,您没有将 todel 设置为 nullptr。您将 todel->parent->left 设置为 nullptr。从这里显示的内容来看,这是安全的,并且不存在内存泄漏。记住这些是指针。他们所做的只是指向某事。您可以有 100 个指向同一内存的指针,将一个设置为 nullptr 不会影响其他 99 个。
-
设置
todel->parent->left的值不会改变todel的值。 -
重新打开,因为虽然OP的问题已经在重复标记中得到回答,但这里有一个基本的误解需要回答。
-
@SebastianRedl 谢谢。当你这样做时,我正要这样做。