例如,有一个函数可以找到一个对象,如果找到了对象则返回shared_ptr,并且必须以某种方式表明没有找到对象。
std::vector<std::shared_ptr> Storage::objects;
std::shared_ptr<Object> Storage::findObject()
{
if (objects.find)
{
return objects[x];
}
else
{
return nullptr;
}
}
std::shared_ptr<Object> obj = Storage::findObject();
if (obj)
{
print("found");
}
else
{
print("not found");
}
返回使用nullptr隐式初始化的shared_ptr是否正确?它会起作用,但可以这样做吗?或者我应该返回shared_ptr默认构造吗?
如果是weak_ptr会是什么?检查空weak_ptr已被返回的正确方法是什么? by weak_ptr :: expired函数还是有其他方法吗?如果通过weak_ptr :: expired检查是唯一的方法那么我如何区分该函数返回空指针,或者对象刚被删除(多线程环境)?
答案 0 :(得分:12)
返回使用nullptr隐式初始化的shared_ptr是否正确?如上例所示?
是的,使用shared_ptr
初始化nullptr
是正确的。将nullptr
分配给shared_ptr
。
或者我应该返回shared_ptr默认构造吗?
您可以通过以下两种方式执行此操作:
返回shared_ptr
初始化nullptr
return shared_ptr<Object>(nullptr);
返回shared_ptr
默认构造。
return nullptr;
两种方式都是正确的,两者都有相同的效果。你可以用任何你想要的方式。
每当与对象关联的最后一个如果是weak_ptr会是什么?检查空weak_ptr已被返回的正确方法是什么?通过weak_ptr :: expired函数还是有其他方法吗?
weak_ptr
被销毁时, nullptr
变为shared_ptr
(到期)。
使用weak_ptr
的正确方法是使用lock方法将其转换为shared_ptr
,然后使用已创建的shared_ptr
。在这种情况下,只有拥有新的weak_ptr
后,您的shared_ptr
才会过期。如果您未将weak_ptr
转换为shared_ptr
,则weak_ptr
可能随时过期。
是的,在使用新创建的shared_ptr
之前,您必须检查它是否为空,因为weak_ptr
可能在您使用{{1}创建shared_ptr
之前已过期方法。
lock