将指针设置为 nullptr 会影响指向同一地址的其他指针吗?

Does setting a pointer to nullptr affect other pointers pointing to the same address?

考虑以下函数,如果节点没有子节点,它会从二叉搜索树中删除该节点:

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。编译器一点也不抱怨。

问题:这样做安全吗?它会泄漏吗?还是未定义的行为?

Since todel->parent->left == todel that means that by setting todel->parent->left to nullptr, I'm just as well setting todel to nullptr.

这是不正确的。 todeltodel->parent->left 是不同的指针变量;将一个设置为 nullptr 不会影响另一个。

所以您没有删除 nullptr(这将是安全的并且不会执行任何操作)。

您的功能是确保无法访问您的节点(即使其成为孤立节点),以便删除其内存是安全的。您将 Right 和 Left 值分配给 nullptr 是完全可以接受的,因为它表明该节点不再是其父节点的子节点。

您正在释放通过写入 delete todel 分配给 C++ 程序的内存。这只能发生一次。将内存释放回 OS 后,指向该变量的任何进一步指针现在都是 "Stale"(即:过时)

您在单独管理每个指针(打结松散的末端)然后删除剩余的指针方面做的是正确的事情。

设置todel->parent->left = nullptr不影响todel中包含的指针值。它也不会释放从 OS 到 todel 分配的内存。您的删除声明确实如此;您对 nullptr 的所有作业都在删除对该内存的其他引用。

todel->parent->lefttodel->parent->right 是指向 todel 的不同指针。如果它们指向与 todel 相同的对象,那么好的做法 将它们重置为指向空值。如果你保留它们,你就会 'dangling pointers' 这可能会导致众所周知难以调试的问题。

请特别注意 delete todel; 表示 "I have finished with the object that todel points at." 如果还有其他变量指向该对象,则可能不是这样!