[英]Does setting a pointer to NULL affect original item you were pointing at?
[英]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
。 编译器完全没有抱怨。
问题:这样做安全吗? 它会泄漏吗? 还是不确定的行为?
由于
todel->parent->left == todel
意味着通过将todel->parent->left
设置为nullptr
,我也将todel
设置为nullptr
。
那是不对的。 todel
和todel->parent->left
是不同的指针变量; 将一个设置为nullptr
不会影响另一个。
因此,您不会删除nullptr
(这是安全且无操作的)。
您的功能是确保无法访问您的节点(即使其成为孤立节点),以便安全删除其内存。 将Right和Left值分配给nullptr
是完全可以接受的,因为这表明该节点不再是其父级的子级。
您可以通过编写delete todel
释放分配给C ++程序的delete todel
。 这只能发生一次。 将内存释放回操作系统后,指向该变量的所有其他指针现在都会“陈旧”(即:已过期)
您正在做正确的事情,分别管理每个指针(打结松散的末端),然后删除其余的指针。
设置todel->parent->left = nullptr
不会影响todel
包含的指针值。 它还不会释放从OS分配给todel
。 您的删除语句可以; 您对nullptr
所做的所有分配都将删除对该内存的其他引用。
todel->parent->left
和todel->parent->right
是todel
不同指针。 如果它们指向的对象与todel
相同,则优良作法是将它们重置为指向null。 如果将其设置为“悬挂指针”,则会导致难以调试的问题。
请特别注意delete todel;
表示“我已经完成了todel
指向的对象。” 如果还有其他变量指向该对象,那可能就不正确了!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.