我正在研究一种智能指针技术,但我遗漏了一件事。我尝试了几种组合,但逻辑如下:
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作为类成员....一定很接近了。
发布于 2013-02-02 00:47:09
正如您所说,您应该使用智能指针:
#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-02 00:39:53
将ref声明为对指针的引用
Uint*& ref = obj;ref现在将引用obj指针。
发布于 2013-02-02 00:41:50
最初,obj和ref都指向(相同) UInt实例。然后删除该实例并将obj设置为NULL。但是ref就像任何其他常规指针一样,所以它仍然指向被删除的实例。
相反,您可以通过在声明中添加&来创建引用变量,或者在本例中创建“引用指针”:
Uint*& ref = obj;那么ref实际上引用了obj,并保持与obj相同的值(指针)。
https://stackoverflow.com/questions/14650883
复制相似问题