繁体   English   中英

将指针设置为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 编译器完全没有抱怨。

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

由于todel->parent->left == todel意味着通过将todel->parent->left设置为nullptr ,我也将todel设置为nullptr

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

因此,您不会删除nullptr (这是安全且无操作的)。

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

您可以通过编写delete todel释放分配给C ++程序的delete todel 这只能发生一次。 将内存释放回操作系统后,指向该变量的所有其他指针现在都会“陈旧”(即:已过期)

您正在做正确的事情,分别管理每个指针(打结松散的末端),然后删除其余的指针。

设置todel->parent->left = nullptr不会影响todel包含的指针值。 它还不会释放从OS分配给todel 您的删除语句可以; 您对nullptr所做的所有分配都将删除对该内存的其他引用。

todel->parent->lefttodel->parent->righttodel不同指针。 如果它们指向的对象与todel相同,则优良作法是将它们重置为指向null。 如果将其设置为“悬挂指针”,则会导致难以调试的问题。

请特别注意delete todel; 表示“我已经完成了todel指向的对象。” 如果还有其他变量指向该对象,那可能就不正确了!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM