移动共享指针的构造函数和=运算符

roh*_*unb 6 c++ smart-pointers move shared-ptr

说,我有一节课:

class GameObject ///header file
{
    ....
    std::shared_ptr<Transform> transform;
}
///cpp file
//Copy Ctor
GameObject::GameObject(const GameObject& rhs)
   :transform(rhs.transform)
{}
//Move CTor
GameObject::GameObject(GameObject&& rhs)
    :transform(std::move(rhs.transform))
{}
Run Code Online (Sandbox Code Playgroud)
  1. 为具有shared_ptr成员变量的类创建移动构造函数是否正确?或者我需要rhs.transform.reset()在搬家后打电话取消分配rhs吗?
  2. 复制构造函数怎么样?
  3. 据推测,复制和移动任务看起来与ctors基本相同,只是return *this在最后?

0x4*_*2D2 11

您的复制和移动构造函数等效于隐式构造函数.删除它们.您不需要将它们明确地写出来作为std::shared_ptr正确实现这两个操作的复制和移动构造函数.

或者我是否需要在搬家后打电话rhs.transform.reset()取消分配rhs

不,移动后的对象将在移动后失去所有权:

shared_ptr(shared_ptr&& r) noexcept;
template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept;
Run Code Online (Sandbox Code Playgroud)

备注:第二个构造函数不得参与重载决策,除非Y*可以转换为T*.

效果:从r构造一个shared_ptr实例.后置条件:*this应包含旧值r.r应该是空的.r.get() == nullptr.

至于复制和移动赋值运算符,它们也是等价的.移动分配将正确转移所有权,复制构造函数将执行浅层复制,以便两者shared_ptr都拥有所有权.

如果你想要一个浅拷贝(共享所有权),那么这shared_ptr是正确的工具.否则,unique_ptr如果您想实施独特的所有权,我建议您使用.