0

我只是在试验数据结构的基础知识,我对某些东西感到好奇。正如您在我的代码中看到的那样,在弄乱了p指针后,我决定删除它。我删除了 p 指针,我认为它也会delete p->proximo(葡萄牙语中的“proximo”是“下一个”)但显然没有。Acesso 3(葡萄牙语中的 Access 3)的结果是 0 22。

那么首先,如果我删除了指针,为什么我仍然可以连接到p->proximo指针?好的,但既然没有,这是一件好事,这意味着我现在可以删除东西了。所以后来我决定把 22 的值放到第一个 Nod 上。所以我不会在列表中有损坏的节点。正如你在第 28 行中看到的那样,我尝试使用p = p->proximo它。但它没有用。当然没有。我删除了指针。有什么办法可以重新创建第一个指针,这样我就可以修复列表,所以第一个节点的值是 22?我试过了

p = new IntNode();
p = p->proximo;

但它也失败了。可能是因为现有的以下节点可能?

我非常感谢你们任何人的帮助

代码:

#include <iostream>
using namespace std;

class IntNode{
public:
  IntNode(){
    proximo = 0;
  }
  IntNode(int file, IntNode *next = 0)
  {
    number = file;
    proximo = next;
  }
  int number;
  IntNode *proximo;
};

int main()
{
  IntNode *p = new IntNode(15);
  cout << "Acesso 1:  " << p->number;
  p->proximo = new IntNode(22);
  cout << endl << "Acesso 2:  " << p->number << "    " << p->proximo->number;
  delete p;
  cout << endl << "Acesso 3:  " << p->number << "     " << p->proximo->number << endl;
  p = new IntNode(5);
  cout << endl << "Acesso 4:  " << p->number << "     " << p->proximo->number << endl;
  p = p->proximo;
  cout << endl << "Acesso 5:  " << p->number << "     " << p->proximo->number << endl;
  delete p->proximo;
  cout << endl << "Acesso 6:  " << p->number << "     " << p->proximo->number << endl;
  return 0;
}
4

2 回答 2

4

为什么我仍然可以连接到 p->proximo 指针?

这是未定义的行为。碰巧在之后(参见@BoPersson 评论中的酒店房间类比p),所指向的内容仍然存在。但你不能依赖它。如果您想增加出现运行时错误的机会,或者让自己能够检查 的有效性,请将其设置为或(在 C++11 中):deletepNULLnullptr

delete p;
p = nullptr;

接下来,当你这样做时:

p = new IntNode(5);

p->proximo设置为空。这是您自己编写的代码,因此您不会感到惊讶:

IntNode(int file, IntNode *next = 0)
{
  number = file;
  proximo = next;
}

最后,回答标题中的问题,

在 C++ 中,在销毁指向类的指针后,我可以使用 new 函数重新利用指针吗

是的你可以。

delete p;
p = someOtherPointerToIntNode;
于 2013-02-27T09:19:58.973 回答
1

删除将释放内存。如果你跳转到这个内存位置,数据仍然会在那里——除非它被覆盖。在删除后使用它被认为是不好的做法,因为它增加了难以找到错误的机会。

于 2013-02-27T09:20:14.973 回答