【问题标题】:Does setting a pointer to nullptr affect other pointers pointing to the same address?设置指向 nullptr 的指针会影响指向同一地址的其他指针吗?
【发布时间】:2015-12-08 17:21:59
【问题描述】:

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

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 设置为nullptr
  • 不,您没有将 todel 设置为 nullptr。您将 todel->parent->left 设置为 nullptr。从这里显示的内容来看,这是安全的,并且不存在内存泄漏。记住这些是指针。他们所做的只是指向某事。您可以有 100 个指向同一内存的指针,将一个设置为 nullptr 不会影响其他 99 个。
  • 设置todel->parent->left的值不会改变todel的值。
  • 重新打开,因为虽然OP的问题已经在重复标记中得到回答,但这里有一个基本的误解需要回答。
  • @SebastianRedl 谢谢。当你这样做时,我正要这样做。

标签: c++ c++11 nullptr


【解决方案1】:

因为todel->parent->left == todel 这意味着通过将todel->parent->left 设置为nullptr,我也可以将todel 设置为nullptr

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

所以您不会删除nullptr(这将是安全且无操作的)。

【讨论】:

  • 我明白了。所以我想我弄错了问题的根源!相应地更改了标题...
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    todel->parent->lefttodel->parent->right 是指向 todel 的不同指针。如果它们指向与todel 相同的对象,则良好做法 将它们重置为指向 null。如果您不设置它们,那么您就会有“悬空指针”,这可能会导致众所周知的难以调试的问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 2019-05-10
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多