1

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

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 作为类成员.... 必须关闭。

4

3 回答 3

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
}

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

于 2013-02-01T16:47:08.560 回答
3

将 ref 声明为对指针的引用

Uint*& ref = obj;

ref 现在将引用 obj 指针。

于 2013-02-01T16:39:52.903 回答
1

最初两者obj和都ref指向(相同的)UInt实例。然后删除实例并设置objNULL. 但是ref就像任何其他常规指针一样,它仍然指向已删除的实例。

&相反,您可以通过添加到声明中来创建引用变量,或者在这种情况下为“引用指针” :

Uint*& ref = obj;

然后ref真正引用obj并保持与 相同的值(指针)obj

于 2013-02-01T16:41:49.593 回答