我有一个像这样的简单问题!
class1 *a = new class1();
class1 *b = a;
delete a;
a= NULL;
现在我想检查b是否为NULL(或被删除),但是b总是指向先前的点。 当我想使用b时,这是有问题的,但之前已经删除过了!
if (b){
//do something here
}
感谢阅读!
答案 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;
动态分配的对象将被破坏,a
和b
都超出范围。
有关可用智能指针的概述,请参阅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