【发布时间】:2016-09-11 02:59:10
【问题描述】:
例如,有一个函数可以找到一个对象,如果找到对象则返回 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");
}
返回 shared_ptr 使用 nullptr 隐式初始化是否正确,如上例所示?它会起作用,但可以这样做吗?还是应该返回 shared_ptr 默认构造的?
万一是weak_ptr呢?检查是否返回了空的weak_ptr的正确方法是什么?通过 weak_ptr::expired 函数还是有其他方法?如果通过 weak_ptr::expired 检查是唯一的方法,那么我如何区分该函数返回空指针,或者对象刚刚被删除(多线程环境)?
【问题讨论】:
-
@AndersK。找不到对象的情况与找到对象一样常见。
-
如果你可以使用 boost,
optional<T>似乎正是你想要的(这似乎成为 C++17 的标准)。如果您不想要开销,那么您基本上只需要记录nullptr实际上是没有价值而不是错误。 -
@JohnLock:不,没有区别。
-
@BenjaminLindley:来自 (cplusplus.com/reference/memory/shared_ptr) - “不拥有任何指针的 shared_ptr 称为空 shared_ptr。指向没有对象的 shared_ptr 称为 null shared_ptr 并且不应被取消引用. 请注意,空的 shared_ptr 不一定是空的 shared_ptr,空的 shared_ptr 也不一定是空的 shared_ptr。”
-
@JohnLock:错了。
标签: c++ shared-ptr smart-pointers weak-ptr