让代码本身解释:
class SomeClass {
private:
std::vector<std::unique_ptr<MyType>> cache;
public:
std::unique_ptr<MyType> getAt1(int i);
MyType* getAt2(int i);
}
std::unique_ptr<MyType> SomeClass::getAt1(int i) {
return std::move(cache[i]);
}
MyType* SomeClass::getAt2(int i) {
return cache[i].get();
}
我想知道getAt1是否会使我的向量不一致,或者两种方式还可以。由于架构缺陷,我真的应该像GetAt1一样返回。
您的意见是什么?
谢谢。
this:
return std::move(cache[i]);
修改向量内的智能指针。它不再管理MyType
指针。get()
之后将返回nullptr
。我不认为这就是你想要的。
如果您想授予对实例的短期使用访问权限,只需返回对托管对象的引用:
MyType& SomeClass::getAt1(int i)
{
return *cache[i];
}
通常的警告在这里适用。如果更改了cache
中的unique_ptr
(被销毁,重新分配,重置等(,则参考可能会变得无效。返回的参考仅用于短期使用。
这当然假设unique_ptr
从来都不是nullptr
。目前尚不清楚您是否允许nullptr
中的CC_8值。如果是,则不要返回参考。根据您的getAt2()
示例,返回原始指针。同样的警告仍然适用。如果unique_ptr
更改,返回的指针将无效。
最后,所有这些都假定SomeClass
是cache
中MyType
对象的所有者,并且get()
功能仅授予临时的,非持有的访问权限。如果没有,则应切换到shared_ptr
,也应该返回shared_ptr
:
std::shared_ptr<MyType> SomeClass::getAt1(int i)
{
return cache[i];
}
您可能已经知道,您可以使用shared_ptr而不是unique_ptr。
getAt1
的问题是向量中的元素然后是空的。我认为您想做getAt2
,而是。