我正在研究某种智能指针技术,但有一件我错过了。我尝试了几种组合,但逻辑如下:
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作为班级成员虽然......必须接近。
答案 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)
最初,obj
和ref
都指向(相同)UInt
实例。然后删除该实例并将obj
设置为NULL
。但ref
就像任何其他常规指针一样,因此它仍然指向已删除的实例。
相反,你可以创建一个引用变量,或者在这种情况下是一个引用指针&#39;将&
添加到声明:
Uint*& ref = obj;
然后ref
确实引用obj
并保持与obj
相同的值(指针)。