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

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

本文关键字:智能 指针 第一次      更新时间:2023-10-16

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

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值存储函数和从Get函数?

我在使用shared_ptr是正确的,还是我应该使用其他东西?

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

我应该将ObjectPtr按值传递给存储函数

是的。虽然可以仍然执行.push_back(std::move(obj))以避免不必要的复制。

和from Get函数?

取决于你是否想

  • 修改vector中原来的shared_ptr,然后通过非const引用返回,
  • 只是观察它,然后返回const引用
  • 以上都不是,即获取自己的副本,然后按值返回。

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

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