将指针设置为 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
.
这是不正确的。 todel
和 todel->parent->left
是不同的指针变量;将一个设置为 nullptr
不会影响另一个。
所以您没有删除 nullptr
(这将是安全的并且不会执行任何操作)。
您的功能是确保无法访问您的节点(即使其成为孤立节点),以便删除其内存是安全的。您将 Right 和 Left 值分配给 nullptr
是完全可以接受的,因为它表明该节点不再是其父节点的子节点。
您正在释放通过写入 delete todel
分配给 C++ 程序的内存。这只能发生一次。将内存释放回 OS 后,指向该变量的任何进一步指针现在都是 "Stale"(即:过时)
您在单独管理每个指针(打结松散的末端)然后删除剩余的指针方面做的是正确的事情。
设置todel->parent->left = nullptr
不影响todel
中包含的指针值。它也不会释放从 OS 到 todel
分配的内存。您的删除声明确实如此;您对 nullptr
的所有作业都在删除对该内存的其他引用。
todel->parent->left
和 todel->parent->right
是指向 todel
的不同指针。如果它们指向与 todel
相同的对象,那么好的做法 将它们重置为指向空值。如果你保留它们,你就会 'dangling pointers' 这可能会导致众所周知难以调试的问题。
请特别注意 delete todel;
表示 "I have finished with the object that todel
points at." 如果还有其他变量指向该对象,则可能不是这样!
考虑以下函数,如果节点没有子节点,它会从二叉搜索树中删除该节点:
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 settingtodel->parent->left
tonullptr
, I'm just as well settingtodel
tonullptr
.
这是不正确的。 todel
和 todel->parent->left
是不同的指针变量;将一个设置为 nullptr
不会影响另一个。
所以您没有删除 nullptr
(这将是安全的并且不会执行任何操作)。
您的功能是确保无法访问您的节点(即使其成为孤立节点),以便删除其内存是安全的。您将 Right 和 Left 值分配给 nullptr
是完全可以接受的,因为它表明该节点不再是其父节点的子节点。
您正在释放通过写入 delete todel
分配给 C++ 程序的内存。这只能发生一次。将内存释放回 OS 后,指向该变量的任何进一步指针现在都是 "Stale"(即:过时)
您在单独管理每个指针(打结松散的末端)然后删除剩余的指针方面做的是正确的事情。
设置todel->parent->left = nullptr
不影响todel
中包含的指针值。它也不会释放从 OS 到 todel
分配的内存。您的删除声明确实如此;您对 nullptr
的所有作业都在删除对该内存的其他引用。
todel->parent->left
和 todel->parent->right
是指向 todel
的不同指针。如果它们指向与 todel
相同的对象,那么好的做法 将它们重置为指向空值。如果你保留它们,你就会 'dangling pointers' 这可能会导致众所周知难以调试的问题。
请特别注意 delete todel;
表示 "I have finished with the object that todel
points at." 如果还有其他变量指向该对象,则可能不是这样!