我只是在实验数据结构的基础知识,我对一些东西很好奇。正如您在我的代码中所看到的,在摆弄了p指针之后,我决定删除它。我删除了p指针,我以为它也会下一个('proximo‘在葡萄牙语中是’delete p->proximo‘),但它显然没有。Acesso 3(葡萄牙语中的Access 3)的结果是0 22。
所以首先,如果我删除了指针,为什么我仍然可以连接到p->proximo指针呢?好吧,但既然它没有,这是一件好事,这意味着我现在可以删除东西了。因此,我决定将22值设置为第一个点头。这样我就不会在列表中有损坏的节点。我尝试使用p = p->proximo,如您在第28行中所见。但它并没有起作用。当然不是。我删除了指针。有没有办法重新创建第一个指针,这样我就可以修复列表,这样第一个节点的值就会是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;
}发布于 2013-02-27 17:19:59
为什么我仍然可以连接到p->proximo指针?
这是一种未定义的行为。碰巧在delete之后,p所指的东西仍然存在(参见@BoPersson的评论中的hotel room analogy )。但你不能依赖这一点。如果您希望增加出现运行时错误的机会,或者使自己能够检查p的有效性,请将其设置为NULL或(C++11中的nullptr):
delete p;
p = nullptr;接下来,当你这样做的时候:
p = new IntNode(5);p->proximo设置为null。这是你自己编写的代码,所以你不应该感到惊讶:
IntNode(int file, IntNode *next = 0)
{
number = file;
proximo = next;
}最后,为了回答标题中的问题,
在c++中,在销毁指向类的指针之后,我是否可以通过新函数重用该指针
可以,停那儿吧。
delete p;
p = someOtherPointerToIntNode;发布于 2013-02-27 17:20:15
删除将释放内存。如果您跳转到此内存位置,数据仍将在那里-除非它被覆盖。在删除之后使用它被认为是不好的做法,因为它增加了很难找到bug的机会。
https://stackoverflow.com/questions/15108242
复制相似问题