C++ 如何正确地从向量返回唯一的_ptr?
让代码自己解释一下:C++ 如何正确地从向量返回唯一的_ptr?,c++,c++11,smart-pointers,unique-ptr,C++,C++11,Smart Pointers,Unique Ptr,让代码自己解释一下: class SomeClass { private: std::vector<std::unique_ptr<MyType>> cache; public: std::unique_ptr<MyType> getAt1(int i); MyType* getAt2(int i); } class-SomeClass{ 私人: 向量缓存; 公众: std::唯一的ptr getAt1(int i); MyType*getAt2
class SomeClass {
private:
std::vector<std::unique_ptr<MyType>> cache;
public:
std::unique_ptr<MyType> getAt1(int i);
MyType* getAt2(int i);
}
class-SomeClass{
私人:
向量缓存;
公众:
std::唯一的ptr getAt1(int i);
MyType*getAt2(int i);
}
std::unique\u ptr SomeClass::getAt1(inti){
返回std::move(缓存[i]);
}
MyType*SomeClass::getAt2(int i){
返回缓存[i].get();
}
我想知道getAt1是否会使我的向量不一致,或者两种方法都可以。
由于架构缺陷,我真的应该像getAt1一样返回
你怎么看
谢谢。getAt1的问题是向量中的元素随后为空。我想你应该做的是
getAt2
。正如你可能已经知道的,你可以使用共享而不是唯一的ptr。这:
return std::move(cache[i]);
修改向量内的智能指针。它不再管理MyType
指针get()
之后将返回nullptr
。我认为那不是你想要的
如果要授予对实例的访问权以供短期使用,只需返回对托管对象的引用:
MyType& SomeClass::getAt1(int i)
{
return *cache[i];
}
通常的警告在这里适用。如果cache
中的unique_ptr
被更改(销毁、重新分配、重置等),则引用可能无效。返回的引用仅用于短期使用
当然,这假定唯一的\u ptr
永远不是空ptr
。尚不清楚是否允许缓存中的nullptr
值。如果是,则不返回引用。按照getAt2()
示例,返回一个原始指针。同样的警告仍然适用。如果unique_ptr
更改,返回的指针将无效
最后,所有这些都假设SomeClass
是cache
中MyType
对象的所有者,而get()
函数只授予对对象的临时、非所有权访问权。如果没有,则应切换到共享\u ptr
,并返回共享\u ptr
:
std::shared_ptr<MyType> SomeClass::getAt1(int i)
{
return cache[i];
}
std::shared\u ptr SomeClass::getAt1(inti)
{
返回缓存[i];
}
1。它肯定会是nullptr。移动构造函数修改rhs。2.引用是可以的,但是如果指针为null,它是未定义的行为,所以我们在这里必须小心。我建议shared_ptr是一种代码味道。这取决于您想要什么。是否要从向量中删除指针?或者您想要一个指向向量中指针所在对象的指针?向量是否总是比从函数返回的指针寿命长?
std::shared_ptr<MyType> SomeClass::getAt1(int i)
{
return cache[i];
}