C ++设置指针为null的指针?

时间:2013-02-01 16:36:20

标签: c++ pointers

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

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

delete obj;
obj = NULL;

if (ref == NULL)
{
    // It works
}
else
{
    // It failed
}

如果没有明确地将ref设置为NULL,有没有办法点击“It Works”?

编辑:

更合适的情况是这样的:

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作为班级成员虽然......必须接近。

3 个答案:

答案 0 :(得分:4)

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

#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
}

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

答案 1 :(得分:3)

将ref声明为对指针的引用

Uint*& ref = obj;

ref现在将引用obj指针。

答案 2 :(得分:1)

最初,objref都指向(相同)UInt实例。然后删除该实例并将obj设置为NULL。但ref就像任何其他常规指针一样,因此它仍然指向已删除的实例。

相反,你可以创建一个引用变量,或者在这种情况下是一个引用指针&#39;将&添加到声明:

Uint*& ref = obj;

然后ref确实引用obj并保持与obj相同的值(指针)。