考虑以下函数,如果节点没有子节点,则从二叉搜索树中删除节点:
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->parent->left == todel
这意味着,通过设置todel->parent->left
到nullptr
,我只是以及设置todel
到nullptr
.
那不对.todel
并且todel->parent->left
是不同的指针变量; 设置一个nullptr
不会影响另一个.
所以你不是删除nullptr
(这是安全的和无操作).