在其他指针中删除对象后,检查指针是否为NULL

时间:2013-05-09 18:33:20

标签: c++ pointers

我有一个像这样的简单问题!

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

delete a;
a= NULL;

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

if (b){
    //do something here
}

感谢阅读!

2 个答案:

答案 0 :(得分:4)

b a之后,无法自动更新NULL。问题代码还说明了为什么在对象已经NULL之后设置指针delete d是最偏的,并且非NULL指针不能保证指针是指向一个有效的对象。

使用std::shared_ptr<class1>代替,因为指向对象的共享所有权:

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

动态分配的对象将被破坏,ab都超出范围。

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

答案 1 :(得分:4)

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

如果您想以原始方式执行此操作,则*b仍然指向a的原始值

当您说class1 *b=a时,您正在获取指针值的副本。因此,无论您对a本身做了什么,b都会依赖此原始值。

如果您希望它与a一起更改,则需要指定a的引用或指向a指针的指针

class1 **b = &a;

现在,想想当你取消引用b时会发生什么,指向什么价值?

它会指向您原来的class1 *。因此,一旦设置a=NULL,您现在有一个指向b的指针a或NULL