我想知道以下是std::shared_ptr
的正确用法。我想对最初创建的指针做的就是把它加到class A
上的向量上,稍后会检索到
class A
{
public:
void AddToVec(std::shared_ptr<B> b)
{
myVec_.push_back(b);
}
std::vector<std::shared_ptr<B>> GetVec()
{
return myVec_;
}
private:
std::vector<std::shared_ptr<B>> myVec_;
}
然后在main
上创建一个指针,并以如下方式传递
int main()
{
A a;
std::shared_ptr<B> ptr = std::make_shared<B>();
a.AddToVec(std::move(ptr));
}
std::move
在主功能上的使用是否正确?- 是否可以简单地在
main
上创建std::shared_ptr
并使用AddToVec
函数移动所有权?
std::move
在主函数上的使用是否正确?
是的,它是正确的。如果您不使用std::move
,它也将编译;但是,它增加了std::shared_ptr
的引用计数。
是否可以简单地在main上创建共享ptr并使用
AddToVec
函数移动所有权?
在某种意义上,它是正确的,您不想增加std::shared_ptr
的引用计数。在AddToVec
中也需要这样,因为b
是函数作用域内的左值引用。因此,您需要显式地将std::move
写入myVec_
,如下所示:
void AddToVec(std::shared_ptr<B> b)
{
myVec_.push_back(std::move(b));
}
还要注意,GetVec
每次都会返回成员myVec_
的副本,这可能不是您想要的。因此,您可能需要以下
// non-const reference to the member
std::vector<std::shared_ptr<B>>& GetVec()
{
return myVec_;
}
// const reference to the member
const std::vector<std::shared_ptr<B>>& GetVec() const /* noexcept */
{
return myVec_;
}