Closed. This question needs details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
去年关闭。
Improve this question
让代码自行解释:
我想知道getAt1是否会使我的 vector 不一致,或者两种方法都可以。
由于架构缺陷,我真的应该像getAt1一样返回。
你怎么看?
谢谢。
修改 vector 内的智能指针。它不再管理
如果要授予对实例的访问权以供短期使用,只需返回对托管对象的引用:
通常的警告在这里适用。如果更改了
当然,这假设
最后,所有这些都假定
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
去年关闭。
Improve this question
让代码自行解释:
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是否会使我的 vector 不一致,或者两种方法都可以。
由于架构缺陷,我真的应该像getAt1一样返回。
你怎么看?
谢谢。
最佳答案
这个:
return std::move(cache[i]);
修改 vector 内的智能指针。它不再管理
MyType
指针。 get()
之后将返回nullptr
。我认为那不是你想要的。如果要授予对实例的访问权以供短期使用,只需返回对托管对象的引用:
MyType& SomeClass::getAt1(int i)
{
return *cache[i];
}
通常的警告在这里适用。如果更改了
unique_ptr
中的cache
(已销毁,重新分配,重置等),则该引用可能变为无效。返回的引用仅用于短期使用。当然,这假设
unique_ptr
绝不是nullptr
。尚不清楚是否在nullptr
中允许cache
值。如果是,则不返回引用。按照getAt2()
示例,返回一个原始指针。同样的注意事项仍然适用。如果unique_ptr
更改,返回的指针将变为无效。最后,所有这些都假定
SomeClass
是MyType
中cache
对象的所有者,并且get()
函数仅授予对这些对象的临时非所有权访问。如果不是,那么您应该改用shared_ptr
并返回shared_ptr
:std::shared_ptr<MyType> SomeClass::getAt1(int i)
{
return cache[i];
}