C++ 移动自定义容器的构造函数?
持有动态分配数组的类的移动构造函数是否应该删除它?例如,我有:C++ 移动自定义容器的构造函数?,c++,c++11,move-semantics,rvalue-reference,C++,C++11,Move Semantics,Rvalue Reference,持有动态分配数组的类的移动构造函数是否应该删除它?例如,我有: 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.siz
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;
};
模板
类MyVector
{
公众:
MyVector()
{
数据=新的T[32];
容量=32;
尺寸=0;
}
MyVector(const MyVector&o)//基本复制构造函数
{
容量=o.容量;
尺寸=o.尺寸;
数据=新T[容量];
对于(int i=0;i<\u size;i++)
{
数据[i]=o.data[i];
}
}
MyVector(const MyVector&&o)//移动构造函数
{
//这里有什么?
}
私人:
T*数据;
无符号整数大小;
无符号整数容量;
};
我知道在执行以下操作时会调用移动构造函数:
MyVector A;
A=MyVector()//右边的那个得到了一个移动构造函数,叫做?
那么它应该与复制构造函数相同吗
持有动态分配数组的类的移动构造函数是否应该删除它?例如,我有:
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;
};
没有要删除的内容。毕竟,这个对象正在构造中。它所要做的就是从RHS上的对象获取资源。它应使RHS处于合理状态。比如说,
MyVector(MyVector<T>&& o)
{
data = o.data;
o.data = nullptr;
capacity = o.capacity;
o.capacity = 0;
size = o.size;
o.size = 0;
}
MyVector(MyVector&&o)
{
data=o.data;
o、 数据=空PTR;
容量=o.容量;
o、 容量=0;
尺寸=o.尺寸;
o、 尺寸=0;
}
请注意,为了使移动构造函数工作,参数不能是
const
。移动构造函数修改其参数。噢,是这样的:MyVector(const MyVector&&o)//移动构造函数{data=o.data;size=o.size;capacity=o.capacity;o.data=null;o.capacity=null;o.size=null;}@shorth\radeon我添加了一个例子。应该尊重类型的不变量,因此您需要对大小
和容量
做些什么。噢,非常感谢,现在我明白了!所以我用了另一种方法,它被调用到左侧,从右侧对象中窃取数据。@shorth\u radeon是的,RHS是临时的,它绑定到一个&&
,这意味着移动重载被拾取。正确地实现移动语义取决于您:-)这可能只是一个一次性练习,但是您的向量
无法处理没有默认构造函数的类型。实向量在创建时不会创建32个新的t
s;它们为32个T
s分配足够的内存,然后根据需要通过放置新的对象来分配该内存。