我有一个带有指向对象的向量的类。我已经在这个向量中介绍了一些元素,在我的主文件中,我已经设法打印它们并添加其他没有问题。现在我正在尝试从该向量中删除一个元素并检查它是否为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..
答案 0 :(得分:4)
删除指针不必将其归零,它只释放在那里分配的内存。删除后使用pointer
是未定义的,因为内存可以自由地用于其他事情。从技术上讲,C ++规范有意将它留给实现,无论它们是否想要将已删除的指针归零,但实际上没有我知道的那样做
答案 1 :(得分:2)
删除指针指向的内存,不会将指针设置为NULL。
答案 2 :(得分:1)
您将指针设置为等于某事物的地址,并且再也不会触及它,因此它当然不会为空。然后你对这个对象做了一些事情是无关紧要的。
使用简单的指针,指针无法确定是否已删除它曾指向的对象。做你想要做的最简单的方法就是把它留给容器:如果你对那个对象感兴趣,在向量中搜索指针,看它是否仍然存在(并且不要删除对象)从向量中删除相应的元素,或者你将再次遇到同样的问题。
答案 3 :(得分:0)
要克服检查已删除的ptr问题,您可以使用boost::shared_ptr。
使用.reset()
而不是删除使用.get()
并检查ptr是否仍然有效
(实际上你可以使用if(p)
,其中p是shared_ptr,因为它有转换为bool)