第一次使用智能指针,我做对了吗?

First time using smart pointers, am I doing it correctly?

我有两个 class。一个创建资源,然后将其发送到另一个 class 存储它以供程序的不同部分访问。我做的是:

typedef std::shared_ptr<Object> ObjectPtr;

ObjectPtr CreatorClass::Create()
{
    ObjectPtr(new Object);
    // ...
    return ObjectPtr;
}

void StorageClass::Store(ObjectPtr obj)
{
    myVector.push_back(obj);
}

ObjectPtr StorageClass::Get(int index)
{
    return myVector[index];
}

我的问题是:

  1. 我使用 shared_ptr 是正确的还是我应该使用其他东西?
  2. 我是否应该将 ObjectPtr 按值传递给 Store 函数并从 Get 函数传递?

Am I correct in using shared_ptr or should I use something else?

如果您需要共享所有权,您是对的。否则你就错了。

Should I be passing ObjectPtr by value to Store function

是的。尽管您可以仍然.push_back(std::move(obj))避免不必要的复制。

and from Get function?

看你想不想

  • 修改vector中原来的shared_ptr,然后return通过非常量引用,
  • 观察一下,然后return通过const reference
  • none 以上,即获取您自己的副本,然后按值 return。

嗯,一般来说,你做的不是很有效率。我看到代码有多个问题,几乎接近于反模式。

  1. 无所不在的创作者。我的天哪,我恨他们。有什么意义 'creator' 在你的例子中?为什么不能创建对象 直接用户?
  2. 商店功能。它有两个问题。首先,它除了将一个元素放入 vector 之外什么都不做,再加上姐妹 get,它 简单地提取。鉴于此,这两个功能应该被发送到 遇见他们的造物主(双关语意)。相反, myVector 应该是 暴露给 class 用户。否则,您将严重限制用户 经验(例如,他们怎么知道他们是否可以打电话 得到给定的索引?他们不知道向量的大小!)。避免 吸气剂和吸气剂。
  3. Store 的第二个问题 - 如果我们想象 Store 不仅仅是将东西推送到 vector,因此它的存在是合理的, 它按值接受共享指针。这意味着,你是原子的 递增计数器。性能哭泣。传递共享指针 减少影响的参考。更好的是,不要使用共享 点子。在我见过的 99% 的情况下,这种用法是不合理的。