2013-05-09 39 views
0

我有一个这样的简单问题!在其他指针中删除对象后指针是否为NULL

class1 *a = new class1(); 
class1 *b = a; 

delete a; 
a= NULL; 

现在我想检查b是否为NULL(或删除)也是,但b总是指向先前的点。 这是有问题的,当我想使用B,但一个已经删除之前!

if (b){ 
    //do something here 
} 

感谢您的阅读!

+5

http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-当我应该使用一个 – stardust 2013-05-09 18:34:51

回答

4

正如一些人所建议的那样,使用共享指针会使这更容易。

如果你想这样做的原始方式,这里是当你说class1 *b=a你正在服用的指针值的副本为什么*b仍指向的a

原始值。所以不管你对a本身做什么,b都会挂在这个原始值上。

如果你想将其与一起改变,你将需要分配一个参考a,或指向a指针

class1 **b = &a; 

所以,现在觉得当你提领b发生了什么,是什么价值是指向?

它会指向您的原始class1 *。所以,一旦你设置a=NULL,你现在有一个指针b指向的a值,或NULL

+0

我认为这比共享指针更好,因为它保留了原始代码的流向。共享指针会改变对象的生命周期以与原始代码不匹配。 – 2013-05-09 18:42:06

+0

这是真的,尽管它需要比共享指针需要更多的内存管理。 – 75inchpianist 2013-05-09 18:45:19

+0

是的,我认为这种方法工作得很好,但它会使代码看起来更多Pointer-Way,a已经是指针,现在b是指针^^的指针。从来没有尝试过,但我想我会尝试在某些情况下使用它!谢谢! – greenpig83 2013-11-29 04:21:40

4

没有办法让b自动更新a已经NULL d。问题代码还说明了为什么在它的对象已被delete设置为NULL的指针时,d最多只能是部分指针,而非指针不能保证指针指向有效对象。

使用std::shared_ptr<class1>而是因为有共同指向的所有权对象:

std::shared_ptr<class1> a = std::make_shared<class1>(); 
std::shared_ptr<class1> b = a; 

动态分配的对象将与两个a遭到破坏和b走出去的范围。

有关可用智能指针的概述,请参阅What C++ Smart Pointer Implementations are available?

+0

所以这是真的,我们必须在这种情况下使用智能指针!裸指针没有其他解决方案! – greenpig83 2013-05-09 18:37:17

+0

@ greenpig83是的,这是事实。这可能是为什么创建智能指针。 – taocp 2013-05-09 18:39:01

+0

你根本不需要使用智能指针。见下面的解决方案有些情况下要求易用智能指针。 – 75inchpianist 2013-05-09 18:42:22