第一次用智能指针,我做得对吗?
First time using smart pointers, am I doing it correctly?
我有两个类。创建资源的类,然后将资源发送给存储资源的另一个类,以供程序的不同部分访问。我所做的是:
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];
}
我的问题是:
- 我使用
shared_ptr
是正确的还是应该使用其他东西? - 我应该通过
ObjectPtr
值存储函数和从Get函数?
我在使用shared_ptr是正确的,还是我应该使用其他东西?
如果你需要共享所有权,你是正确的。否则你就错了。
我应该将ObjectPtr按值传递给存储函数
是的。虽然可以仍然执行.push_back(std::move(obj))
以避免不必要的复制。
和from Get函数?
取决于你是否想
- 修改vector中原来的
shared_ptr
,然后通过非const引用返回, - 只是观察它,然后返回const引用
- 以上都不是,即获取自己的副本,然后按值返回。
嗯,一般来说,你做得不是很有效。我看到了代码中的多个问题,几乎接近反模式。
- 无处不在的创造者。天哪,我讨厌他们。a的意义是什么"创造者"在你的例子中?为什么不能创建对象直接用户?
- 存储功能。它有两个问题。首先,除了将一个元素放入vector对象之外,它什么也不做,再加上姊妹元素get简单的提取。鉴于此,这两个函数应该被发送到见他们的造物主(双关语)。相反,myVector应该是暴露给类用户。否则,您将严重限制用户经验(例如,他们怎么知道他们是否可以打电话得到给定索引?它们不知道向量的大小!)避免getter和setter。
- 关于Store的第二个问题——如果我们想象Store不仅仅是把东西推到vector,因此它的存在是合理的,它按值接受共享指针。也就是说,你是原子递增计数器。性能哭泣。通过传递共享指针减少参考影响。最好不要使用sharedponters。在我见过的99%的情况下,这种用法是不合理的。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 优先顺序:智能指针和类析构函数
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 智能指针作为无序映射键,并通过引用进行比较
- 智能指针概念所有权和寿命
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 尝试使用智能指针时引发异常
- 我可以制作指向智能指针的智能指针吗?
- 通过智能指针和转换对基本模板参数进行模板推导
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 从堆栈分配的原始指针构造智能指针
- 初始化指向类实例的智能指针并访问其方法
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 编译器不会使用 -std=c++11 编译智能指针
- 具有智能指针的多态性
- C++:矢量分配器行为、内存分配和智能指针
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 指向函数签名中的常量智能指针
- 使用智能指针附加的继承对象的深层复制