Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;指向对象的指针有问题_C++_Pointers_Object - Fatal编程技术网

C++ C++;指向对象的指针有问题

C++ C++;指向对象的指针有问题,c++,pointers,object,C++,Pointers,Object,我有一个类,它有指向对象的指针向量。我在这个向量中引入了一些元素,在我的主文件中,我成功地打印了它们并添加了其他元素,没有任何问题。现在我试图从向量中删除一个元素,并检查它是否为NULL,但它不起作用 我在里面填上了课堂测试: Other *a = new Other(1,1); Other *b = new Other(2,2); Other *c = new Other(3,3); v->push_back(a); v->push_back(b); v->push_bac

我有一个类,它有指向对象的指针向量。我在这个向量中引入了一些元素,在我的主文件中,我成功地打印了它们并添加了其他元素,没有任何问题。现在我试图从向量中删除一个元素,并检查它是否为NULL,但它不起作用

我在里面填上了课堂测试:

Other *a = new Other(1,1);
Other *b = new Other(2,2);
Other *c = new Other(3,3);

v->push_back(a);
v->push_back(b);
v->push_back(c);
在我的主要文件中,我有:

Test t;
(...)

Other *pointer = t.vect->at(0);

delete t.vect->at(0);
t.vect->erase(t.vect->begin());

if (pointer == NULL) { cout << "Nothing here.."; } // Never enters here..
测试t;
(...)
其他*指针=t.vect->at(0);
删除t.vect->at(0);
t、 vect->erase(t.vect->begin());

if(指针==NULL){cout删除指针指向的内存,不会将指针设置为NULL。

删除指针指向的内存,不会将指针设置为NULL。

删除指针不必将其归零,它只会释放分配给那里的内存。但是,删除后,使用
指针是未定义的,因为内存是空闲的技术上,C++规范故意把它留给实现,不管它们是否想要删除一个被删除的指针,但是实际上我知道的任何一个都不允许删除它,它只需要释放它的内存。从技术上讲,C++规范有意把它留给实现,无论它们是否想要删除一个被删除的指针,但是实际上我所知道的任何一个都不等于“/p>< p>你把指针设置为与某物的地址相等,并且永远不会再碰它,所以当然它不会是空的。然后你对这个物体做了些什么是无关紧要的


使用简单的指针,指针没有安全的方法来确定它曾经指向的对象是否已被删除。最简单的方法是将它放在容器中:如果你对该对象感兴趣,在向量中搜索指针,看看它是否仍然存在(如果不从向量中删除相应的元素,请不要删除该对象,否则您将再次遇到相同的问题)。

您将指针设置为某个对象的地址,并且再也没有接触过它,因此它当然不会为空。您随后对该对象做了一些操作这一事实与此无关


使用简单的指针,指针没有安全的方法来确定它曾经指向的对象是否已被删除。最简单的方法是将它放在容器中:如果你对该对象感兴趣,在向量中搜索指针,看看它是否仍然存在(如果不从向量中删除相应的元素,请不要删除对象,否则您将再次遇到相同的问题)。

要克服检查已删除的ptr问题,可以使用

使用
.reset()
而不是delete,并使用
.get()


(实际上,您可以使用
if(p)
,其中p是共享的\u ptr,因为它有一个到bool的转换)

来克服您可以使用的检查已删除ptr的问题

使用
.reset()
而不是delete,并使用
.get()


(实际上,您可以使用
if(p)
,其中p是共享的\u ptr,因为它转换为bool)在那种情况下,我可以做任何我想做的事吗?我不确定你在做什么,检查的重点是什么?无论如何注意向量中的指针被删除,但是它是一个完全不同的拷贝,它被检查。没有任何方式,C++运行时会搜索你的整个程序。他把地址写了,然后把它们全部放在右边。这样我就可以做我所做的事了吗?我不知道你在做什么,检查的重点是什么?无论如何注意向量中的指针被删除了,但是它是一个完全不同的拷贝,被检查过。没有任何方式是C++运行时去搜索你的E。为地址的每个副本重新编写程序,并将它们全部设置为null。删除后只需将指针设置为null。它可能看起来是多余的,但实际上不是。删除会释放内存,将其设置为null,让我们检查它是否已被删除。@zxcvbnm:这是一个很好的做法,但在这种情况下不起作用。Zibd有两个指针指向同一个对象;使用其中一个删除该对象,然后将其设置为NULL,另一个仍然指向已释放的内存。删除该对象后,您只需将指针设置为NULL。它可能看起来是多余的,但实际上不是。delete释放内存,将其设置为NULL让您检查它是否已被删除。@zxcvbnm:that是一种很好的做法,但在这种情况下不起作用。Zibd有两个指针指向同一个对象;使用其中一个指针删除该对象,然后将其设置为NULL,另一个指针仍指向已释放的内存。