c++ - 删除后指针还能用吗?

标签 c++ pointers

问题是从排序列表中删除重复项,代码是:

 /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* deleteDuplicates(ListNode* head) {
            if (head == NULL) return NULL;
            for (ListNode* prev = head, *cur = head->next; cur; cur = cur->next)
            {
                if (prev->val == cur->val)
                {
                    prev->next = cur ->next;
                    delete cur;
                }
                else
                {
                    prev = cur;
                }
            }
            return head;
        }
    };

代码是对的,我的谜题是:

指针“cur”,在“delete”之后,在“for”中使用“cur”和“cur = cur->next”。为什么没问题?

不好意思打扰了,leetcode给代码AC了,所以我怀疑自己感谢解答。

最佳答案

首先澄清一下:指针是指向内存区域的东西。

如果您在指针上调用 delete,您将释放该指针指向的任何内容,但您不会破坏指针本身。您可以重用该指针,但在它被删除后再次取消引用它是未定义的行为,因为没有任何东西可以保证它曾经指向的内存仍然对您可用。

您的代码导致 UB自从之后

delete cur;

您使用 cur = cur->next 取消引用该指针。您无法保证 cur 仍指向有效的内存区域,其中 next 具有作为地址的实际含义。

您的代码的正确版本如下:

ListNode* deleteDuplicates(ListNode* head) {
  if (head == NULL) return NULL;
  for (ListNode* prev = head, *cur = head->next; prev->next; cur = prev->next)
  {
    if (prev->val == cur->val)
    {
      prev->next = cur->next;
      delete cur;
    }
    else
    {
      prev = cur;
    }
  }
  return head;
}

Live Example

关于c++ - 删除后指针还能用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32023047/

相关文章:

java - 使接口(interface)程序化而不是语义化是什么意思?

c++ - 二进制搜索树析构函数 C++

c - TDataset --> 指向行列矩阵的指针?

c++ - 替换循环缓冲区/fifo 队列数组元素中的 "FOR()"宏

c++ - 长整数的意外模数行为

c++ - 指针和整数 C++ 之间的比较问题

字符 *a, *b; (b-a) 是什么类型,我该如何打印它?

c++ - 在数组上使用迭代器

c++ - 在此代码中,new 创建的指针在哪里被删除?

c++ - Windows 上 native C++ 应用程序中的自动死代码检测?