std::shared_ptr结合std::move存入类成员vector的用法是否正确?
疑问1:main函数中std::move的用法是否正确?
完全正确。
此处std::move将本地ptr转为右值,传入AddToVec的按值形参时会触发std::shared_ptr的移动构造,相比直接拷贝传参,省去了一次原子引用计数递增、以及后续本地ptr销毁时的原子引用计数递减操作,性能更优。且你明确后续不会再使用原ptr,移动后原ptr被置空的行为完全符合使用预期,不存在非法操作。
疑问2:创建shared_ptr后通过AddToVec转移所有权的操作是否合理?
在你描述的场景下完全合理。
你创建shared_ptr的唯一用途就是存入class A的vector中,后续通过A的接口访问管理B对象,这个设计本身没有正确性问题。
有几个可选优化点可参考:
- 可以在
AddToVec的push_back步骤也加上std::move,进一步减少一次引用计数操作:
void AddToVec(std::shared_ptr<B> b) { myVec_.push_back(std::move(b)); }
- 当前
GetVec返回的是整个vector的拷贝,如果你不需要外部修改A内部的vector,建议改为返回const std::vector<std::shared_ptr<B>>&,避免不必要的vector拷贝开销。 - 如果你的需求里
A应该是B对象的唯一管理者,外部取出B对象仅做临时访问、不应该延长其生命周期,可以考虑将vector元素改为std::unique_ptr<B>,GetVec返回元素的裸指针或std::weak_ptr<B>,这属于需求适配的调整,不影响你当前实现的正确性。
内容的提问来源于stack exchange,提问作者Yorda
相关产品推荐
相关产品推荐

