首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中,在销毁指向类的指针之后,我是否可以通过新函数重用该指针

在C++中,在销毁指向类的指针之后,我是否可以通过新函数重用该指针
EN

Stack Overflow用户
提问于 2013-02-27 17:17:51
回答 2查看 162关注 0票数 0

我只是在实验数据结构的基础知识,我对一些东西很好奇。正如您在我的代码中所看到的,在摆弄了p指针之后,我决定删除它。我删除了p指针,我以为它也会下一个('proximo‘在葡萄牙语中是’delete p->proximo‘),但它显然没有。Acesso 3(葡萄牙语中的Access 3)的结果是0 22。

所以首先,如果我删除了指针,为什么我仍然可以连接到p->proximo指针呢?好吧,但既然它没有,这是一件好事,这意味着我现在可以删除东西了。因此,我决定将22值设置为第一个点头。这样我就不会在列表中有损坏的节点。我尝试使用p = p->proximo,如您在第28行中所见。但它并没有起作用。当然不是。我删除了指针。有没有办法重新创建第一个指针,这样我就可以修复列表,这样第一个节点的值就会是22?我试着用

代码语言:javascript
复制
p = new IntNode();
p = p->proximo;

但它也失败了。可能是因为存在下面的节点?

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

代码:

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-27 17:19:59

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

这是一种未定义的行为。碰巧在delete之后,p所指的东西仍然存在(参见@BoPersson的评论中的hotel room analogy )。但你不能依赖这一点。如果您希望增加出现运行时错误的机会,或者使自己能够检查p的有效性,请将其设置为NULL或(C++11中的nullptr):

代码语言:javascript
复制
delete p;
p = nullptr;

接下来,当你这样做的时候:

代码语言:javascript
复制
p = new IntNode(5);

p->proximo设置为null。这是你自己编写的代码,所以你不应该感到惊讶:

代码语言:javascript
复制
IntNode(int file, IntNode *next = 0)
{
  number = file;
  proximo = next;
}

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

在c++中,在销毁指向类的指针之后,我是否可以通过新函数重用该指针

可以,停那儿吧。

代码语言:javascript
复制
delete p;
p = someOtherPointerToIntNode;
票数 4
EN

Stack Overflow用户

发布于 2013-02-27 17:20:15

删除将释放内存。如果您跳转到此内存位置,数据仍将在那里-除非它被覆盖。在删除之后使用它被认为是不好的做法,因为它增加了很难找到bug的机会。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15108242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档