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是类成员呢?提供类成员与指针引用的一些详细信息、优缺点