我的课堂上有很多指针向量:
std::vector<Customer *> customers
现在,我想实现move构造函数。我发现我可以使用std::move
中的std::vector
。问题是我不知道是否会清除旧的向量值。请任何人向我解释一下。
我的移动构造函数:
OpenTable::OpenTable(OpenTable&& other) : BaseAction(), tableId(other.tableId)
{
customers=std::move(other.customers);
}
答案 0 :(得分:3)
从std::move()
开始std::vector
之后,旧向量将具有0个元素,并且没有为其分配动态内存。新构建的向量占用了该内存。无需清除任何元素。
但是,也应该这样说:
我的课堂上有很多指针向量:
这是一个错误...我们不再使用C ++ 98。原始指针不指示谁拥有内存,也不指示对象在该地址的寿命。现在,您可能正确,但可能不正确。那么您的代码的未来维护者呢?最好不要碰碰运气:请改用smart pointer。或者-只需将实际对象放置在向量中即可。就像评论所暗示的那样,如果您要移动而不是复制矢量,则不会为相同的对象制作多余的副本。
Resource Management section of the C++ Core Programming Guidelines中有关此点的更多信息。
答案 1 :(得分:2)
问题是我不知道它是否会清除旧的向量值。
保证将向量从其移出后为空。
customers=std::move(other.customers);
与其默认构造该成员然后进行移动分配,不如直接在成员初始化列表中移动该成员:
OpenTable::OpenTable(OpenTable&& other) : ..., customers(std::move(other.customers))
尽管看起来很像您的构造函数与隐式move构造函数没有什么不同,所以您可以改用:
OpenTable::OpenTable(OpenTable&&) = default;
更好的是,取决于类的其余部分,可以隐式声明move构造函数,因此您甚至不需要该默认声明。