0

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

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

delete a;
a= NULL;

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

if (b){
    //do something here
}

谢谢阅读!

4

2 回答 2

4

d后无法b自动更新。问题代码还说明了为什么在对象被d 之后设置指针至多是部分的,并且非指针不能保证指针指向有效对象。aNULLNULLdeleteNULL

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

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

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

请参阅有哪些可用的 C++ 智能指针实现?有关可用智能指针的概述。

于 2013-05-09T18:35:23.947 回答
4

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

如果您想以原始方式进行操作,这就是为什么*b仍然指向原始值的原因a

当您说class1 *b=a您正在获取 a的指针值的副本时。所以不管你对a自己做什么,b都要坚持这个原始价值。

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

class1 **b = &a;

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

它将指向您原来的class1 *. 所以,一旦你设置a=NULL了 ,你现在就有了一个指向或 NULLb值的指针a

于 2013-05-09T18:39:10.887 回答