std::shared_ptr的用法正确吗?



我想知道以下是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));
}
  1. std::move在主功能上的使用是否正确?
  2. 是否可以简单地在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_;
}

相关内容

  • 没有找到相关文章

最新更新