返回null shared_ptr是否正确?

时间:2016-05-15 05:43:00

标签: c++ shared-ptr smart-pointers weak-ptr

例如,有一个函数可以找到一个对象,如果找到了对象则返回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");
}
  1. 返回使用nullptr隐式初始化的shared_ptr是否正确?它会起作用,但可以这样做吗?或者我应该返回shared_ptr默认构造吗?

  2. 如果是weak_ptr会是什么?检查空weak_ptr已被返回的正确方法是什么? by weak_ptr :: expired函数还是有其他方法吗?如果通过weak_ptr :: expired检查是唯一的方法那么我如何区分该函数返回空指针,或者对象刚被删除(多线程环境)?

1 个答案:

答案 0 :(得分:12)

  

返回使用nullptr隐式初始化的shared_ptr是否正确?如上例所示?

是的,使用shared_ptr初始化nullptr是正确的。将nullptr分配给shared_ptr

也是正确的
  

或者我应该返回shared_ptr默认构造吗?

您可以通过以下两种方式执行此操作:

  1. 返回shared_ptr初始化nullptr

    return shared_ptr<Object>(nullptr);
    
  2. 返回shared_ptr默认构造。

    return nullptr;
    
  3. 两种方式都是正确的,两者都有相同的效果。你可以用任何你想要的方式。

      

    如果是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