return null shared_ptr 是否正确?

Is it correct to return null shared_ptr?

例如,有一个查找对象的函数,如果找到对象,则 returns 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. return shared_ptr 像上面的例子那样用 nullptr 隐式初始化是否正确?它会起作用,但是可以这样做吗?或者我应该 return shared_ptr 默认构建?

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

Is it correct to return shared_ptr implicitly initialized with nullptr like in upper example?

是的,用nullptr初始化shared_ptr是正确的。将nullptr赋值给shared_ptr也是正确的。

Or should I return shared_ptr default constructed instead?

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

  1. 返回 shared_ptrnullptr

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

    return shared_ptr<Object>();
    

两种方式都是正确的,而且效果是一样的。你可以使用任何你想要的方式。

What in case it would be weak_ptr? What is proper way to check that empty weak_ptr has been returned? by weak_ptr::expired function or are there other ways?

每当与对象关联的最后一个 shared_ptr 被销毁时,

weak_ptr 变为 nullptr(过期)。

使用 weak_ptr 的正确方法是使用 lock 方法将其转换为 shared_ptr,然后使用创建的 shared_ptr。在这种情况下,您的 weak_ptr 将不会过期,直到您拥有新的 shared_ptr。如果您不将 weak_ptr 转换为 shared_ptr,您的 weak_ptr 可能随时过期。

是的,在使用新创建的 shared_ptr 之前,您必须检查它是否不为空,因为 weak_ptr 可能在您使用 [= 创建 shared_ptr 之前已经过期34=]方法。

std::weak_ptr<Object> Storage::findObject();

...

std::weak_ptr  <Object> weak   = Storage::findObject();
std::shared_ptr<Object> shared = weak.lock();
if (shared) // check that weak was not expired when we did "shared = weak.lock()"
{
    // do something with shared, it will not expire.
}