C ++在指向对象时出现问题

时间:2010-04-18 00:44:50

标签: 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_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..

4 个答案:

答案 0 :(得分:4)

删除指针不必将其归零,它只释放在那里分配的内存。删除后使用pointer是未定义的,因为内存可以自由地用于其他事情。从技术上讲,C ++规范有意将它留给实现,无论它们是否想要将已删除的指针归零,但实际上没有我知道的那样做

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您将指针设置为等于某事物的地址,并且再也不会触及它,因此它当然不会为空。然后你对这个对象做了一些事情是无关紧要的。

使用简单的指针,指针无法确定是否已删除它曾指向的对象。做你想要做的最简单的方法就是把它留给容器:如果你对那个对象感兴趣,在向量中搜索指针,看它是否仍然存在(并且不要删除对象)从向量中删除相应的元素,或者你将再次遇到同样的问题。

答案 3 :(得分:0)

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

使用.reset()而不是删除使用.get()并检查ptr是否仍然有效 (实际上你可以使用if(p),其中p是shared_ptr,因为它有转换为bool)