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");
}
return shared_ptr 像上面的例子那样用 nullptr 隐式初始化是否正确?它会起作用,但是可以这样做吗?或者我应该 return shared_ptr 默认构建?
万一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?
您可以通过两种方式执行此操作:
返回 shared_ptr
用 nullptr
初始化
return shared_ptr<Object>(nullptr);
返回 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.
}
例如,有一个查找对象的函数,如果找到对象,则 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");
}
return shared_ptr 像上面的例子那样用 nullptr 隐式初始化是否正确?它会起作用,但是可以这样做吗?或者我应该 return shared_ptr 默认构建?
万一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?
您可以通过两种方式执行此操作:
返回
初始化shared_ptr
用nullptr
return shared_ptr<Object>(nullptr);
返回
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.
}