C++ C++;是否将指针的指针设置为null?

C++ C++;是否将指针的指针设置为null?,c++,pointers,C++,Pointers,我正在研究某种智能指针技术,但有一点我不知道。我尝试了几种组合,但逻辑如下: UInt *obj = new UInt; UInt *ref; ref = obj; delete obj; obj = NULL; if (ref == NULL) { // It works } else { // It failed } 有没有办法在不显式地将ref设置为NULL的情况下点击“ItWorks” 编辑: 更合适的情况如下: class A { public: A()

我正在研究某种智能指针技术,但有一点我不知道。我尝试了几种组合,但逻辑如下:

UInt *obj = new UInt;
UInt *ref;
ref = obj;

delete obj;
obj = NULL;

if (ref == NULL)
{
    // It works
}
else
{
    // It failed
}
有没有办法在不显式地将ref设置为NULL的情况下点击“ItWorks”

编辑:

更合适的情况如下:

class A
{
public:

    A(): ref(NULL) {}
    ~A()
    {
        if (ref != NULL)
            delete ref;
    }
    int *ref;
};

    int *obj = new int;
    A *host = new A();

    host->ref = obj; ???

    delete obj;
      obj = NULL;

    if (host->ref == NULL)
    {
        // It works.
    }
    else
    {
        // It failed.
    }


但无法将int*&ref用作类成员。。。。必须关闭。

将ref声明为指针的引用

Uint*& ref = obj;

ref现在将引用obj指针。

将ref声明为对指针的引用

Uint*& ref = obj;

ref现在将引用obj指针。

首先
obj
ref
都指向(相同的)
UInt
实例。然后删除实例并将
obj
设置为
NULL
。但是
ref
就像其他常规指针一样,所以它仍然指向已删除的实例

相反,您可以通过在声明中添加
&
来创建引用变量,或者在本例中创建“引用指针”:

Uint*& ref = obj;

然后
ref
实际上指的是
obj
,并保持与
obj
相同的值(指针)
obj
ref
最初都指向(相同的)
UInt
实例。然后删除实例并将
obj
设置为
NULL
。但是
ref
就像其他常规指针一样,所以它仍然指向已删除的实例

相反,您可以通过在声明中添加
&
来创建引用变量,或者在本例中创建“引用指针”:

Uint*& ref = obj;

然后
ref
实际上指的是
obj
并保持与
obj
相同的值(指针),正如您所说,您应该使用智能指针:

#include <memory>

std::shared_ptr<UInt> obj = std::make_shared<UInt>();
std::weak_ptr<UInt> ref = obj;

obj.reset();

if (ref.expired())
{
    // It works
}
else
{
    // It failed
}
#包括
std::shared_ptr obj=std::make_shared();
标准::弱_ptr ref=obj;
obj.reset();
如果(参考expired())
{
//它起作用了
}
其他的
{
//它失败了
}

当标准库为您提供内存管理功能时,不要尝试管理自己的内存。

正如您所说,您应该使用智能指针:

#include <memory>

std::shared_ptr<UInt> obj = std::make_shared<UInt>();
std::weak_ptr<UInt> ref = obj;

obj.reset();

if (ref.expired())
{
    // It works
}
else
{
    // It failed
}
#包括
std::shared_ptr obj=std::make_shared();
标准::弱_ptr ref=obj;
obj.reset();
如果(参考expired())
{
//它起作用了
}
其他的
{
//它失败了
}

当标准库为您提供内存管理功能时,不要尝试管理您自己的内存。

UInt
UInt
是您的智能指针类吗?不应在堆上分配智能指针。问题标题中的“指针的指针”代表什么?此代码中没有智能指针。很抱歉,忘记智能指针场景。UInt可以改为int。是的,我必须同意其他的评论。那些指针在我看来相当愚蠢。
UInt
是您的智能指针类吗?不应在堆上分配智能指针。问题标题中的“指针的指针”代表什么?此代码中没有智能指针。很抱歉,忘记智能指针场景。UInt可以改为int。是的,我必须同意其他的评论。这些指针对我来说似乎相当愚蠢。正是如此,当有一个人人都知道的标准时,阅读您的代码的人将不需要阅读和理解您自己的实现。而且,最有可能的是,standard会比你的更好。没错,我从不使用std库,我想我可以试试。我仍然对如何完成这个示例感兴趣。确切地说,这样当有一个人人都知道的标准时,阅读您的代码的人就不需要阅读和理解您自己的实现。而且,最有可能的是,standard会比你的更好。没错,我从不使用std库,我想我可以试试。我仍然对如何完成这个示例感兴趣。哦,太好了,为了简单起见,我使用了这个示例,但是如果ref是类成员呢?提供了类成员与指针引用的一些细节、优缺点。哦,太好了,为了简单起见,我使用了这个示例,但是如果ref是类成员呢?提供类成员与指针引用的一些详细信息、优缺点