我正在看一些我继承的代码,它有一个矩阵类,它在C++中实现2D矩阵,并且有移动构造函数和赋值操作符。
其实施方式如下:
template<typename T, int rows, int cols>
class matrix_data {
...
std::unique_ptr<T[]> data_;
// Some definitions
typedef matrix_data<T, rows, cols> this_type
matrix_data(this_type && other)
{
std::swap(data_, other.data_);
}
};现在,我不知道为什么这里要交换数据指针。我觉得应该像
data_ = std::move(other.data_);我猜使用这个交换仍然可以,因为other实例在移动之后应该处于无效状态。
我的问题是,我是否可以用data_ = std::move(other.data_);替换语句,是否有一些unique_ptr删除的东西,这是执行交换而不是移动的原因,也就是说,如果我做了移动,原始数据会被正确删除吗?
发布于 2017-08-15 13:46:13
回答你的问题:
是的,你可以用
data_ = std::move(other.data_);但如注释所示,如果不实现移动构造函数,只要不实现复制构造函数、复制赋值操作符、移动赋值运算符或析构函数,就会发生这种情况。如果您已经实现了上述功能之一,那么将move构造函数标记为=default也将完成这项工作。
在这种情况下,交换对象的内容确实是不必要的,因为实际上没有什么可交换的,因为这是一个(move)构造函数,this->data_没有指向任何以前分配的内存位置,这些位置应该在指针被覆盖后释放。
因此,在实现移动赋值操作符时,交换通常是完成的,因为在本例中,this->data_通常保存一个指向某个需要释放的内存位置的指针。通过将这个指针放入moved from对象中,它所指向的内存将在调用moved对象的析构函数时释放。
https://stackoverflow.com/questions/45692747
复制相似问题