【问题标题】:Move constructor for a custom container?移动自定义容器的构造函数?
【发布时间】:2014-02-24 07:12:32
【问题描述】:

是一个持有动态分配数组的类的移动构造函数应该删除它吗?例如我有:

template<typename T>
class MyVector
{
public:
MyVector()
{
data = new T[32];
capacity = 32;
size = 0;
}

MyVector(const MyVector<T>& o) //The basic copy constructor
{
capacity = o.capacity;
size = o.size;
data = new T[capacity];

for(int i = 0; i < _size; i++)
{
data[i] = o.data[i];
}
}

MyVector(const MyVector<T>&& o) //The move constructor
{
//What goes here?
}

private:
T* data;
unsigned int size;
unsigned int capacity;
};

我知道当我执行以下操作时会调用移动构造函数:

我的向量 A; A = 我的向量(); //右边那个得到一个调用的移动构造函数? 那么它应该与复制构造函数相同吗?

【问题讨论】:

  • 这可能只是一个一次性练习,但您的 Vector 不适用于没有默认构造函数的类型。真实向量不会在创建时创建 32 个新的Ts;他们为 32 Ts 分配了足够的内存,然后根据需要通过placement-new 将内存与对象一起分配。

标签: c++ c++11 move-semantics rvalue-reference


【解决方案1】:

是一个持有动态分配数组的类的移动构造函数应该删除它吗?例如我有:

没有什么可删除的。毕竟对象正在构建。它应该做的就是从 RHS 上的对象中获取资源。它应该使 RHS 处于合理状态。例如,

MyVector(MyVector<T>&& o)
{
    data = o.data;
    o.data = nullptr;

    capacity = o.capacity;
    o.capacity = 0;

    size = o.size;
    o.size = 0;
}

请注意,为了使移动构造函数起作用,参数不能是const。移动构造函数修改其参数。

【讨论】:

  • 哦,原来是这样的: MyVector(const MyVector&& o) //移动构造函数 { data = o.data;大小 = o.size;容量 = o.容量; o.data = null; o.容量=空; o.size = null; } ?
  • @shortage_radeon 我添加了一个例子。应该尊重类型的不变量,因此您还需要对size 和capacity 做一些事情。
  • 哦,非常感谢,现在我明白了!所以我有相反的方式,它被调用左侧,从右侧对象窃取数据。
  • @shortage_radeon 是的,RHS 是临时的,它绑定到 &amp;&amp;,这意味着移动重载被拾取。正确实现移动语义取决于您:-)
猜你喜欢
  • 2017-11-18
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多