【问题标题】:Will deleting an object set its references equal to NULL?删除对象会将其引用设置为 NULL 吗?
【发布时间】:2011-09-03 02:04:50
【问题描述】:

我有一个指向指针的数组,当我执行array [index]=classpointer; 并调用delete classpointer; 时,存储在array[index] 的值是否会变为NULL?

【问题讨论】:

  • 抱歉学究,但您的问题标题是关于 array as a whole 是否等于 NULL,您的问题本身询问是否 index 变量 i> 变为 NULL,对您的问题的唯一合理解释是您实际上是在询问 特定数组成员 是否变为 NULL。在考虑使用指针之前,您需要更加精确!
  • 补充汤姆所说的,classpointer 的值存储在数组中与您的问题本质上无关。它可以保存在任何其他变量中,您也会遇到同样的问题。

标签: c++ arrays pointers memory-management


【解决方案1】:

没有。它仍然指向classpointer 之前指向的位置,或者换句话说,它悬空。

【讨论】:

  • @RandenDavis :指针值将与delete 之前的值相同,但取消引用该指针将调用undefined behavior
  • @Randen Davis - 不。一旦你这样做了delete classpointer;classpointer 指向资源就会被释放。因此,array[index] 的指针悬空并取消引用它会导致 未定义的行为
【解决方案2】:

没有。数组索引总是一个整数(除非你正在做一些疯狂的运算符重载)。整数是原始数据类型,原始数据类型为 NULL 是没有意义的。

您的意思是“数组[索引] 会变为 NULL 吗?”请参阅@Mahesh 的回答。

【讨论】:

    【解决方案3】:

    为了帮助您记住这个问题的答案,请考虑:

    T* p = ...;
    delete p;
    

    pdelete 之后和它本身离开范围之前会发生什么,或者它的成员数据的对象被销毁?没有单一的答案。因此,如果 C++ 采取额外的操作将p 设置为NULL,那么至少在某些时候它会浪费精力——设置一个随后立即丢弃的变量。在 C++ 中,一个指导原则是您可能不想要或不需要的功能没有运行时成本。

    进一步考虑:

    T* p = ...
    T* p1 = p;
    delete p;
    

    突然间,将p 设置为NULL 的想法——这似乎使检查指针的有效性变得容易——落空了。让编译器知道可能仍然引用刚刚删除的对象的所有其他指针是不切实际的,并且在运行时跟踪该信息并将所有指针归零的成本是不切实际的。

    所以,要明确地说,如果...

    T* p = ...;
    delete p;
    

    ...p 设置为 0x12345678,那么在 delete 之后,p 仍将是 0x12345678。 delete 永远不会改变它的论点。任何访问该地址内存的尝试都将导致未定义的行为(当然,除非随后的堆分配请求恰好返回相同的地址)。

    另外,如果你自己设置了一个指向NULL 的指针,你可以安全地再次调用delete,所以这样做没有任何意义:

    if (p != NULL) delete p;
    

    【讨论】:

      【解决方案4】:

      仅当它是 std::weak_ptr 时。普通指针将保持不变。

      【讨论】:

        猜你喜欢
        • 2012-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多