首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移动构造函数C++11

移动构造函数C++11
EN

Stack Overflow用户
提问于 2017-08-15 12:20:48
回答 1查看 605关注 0票数 5

我正在看一些我继承的代码,它有一个矩阵类,它在C++中实现2D矩阵,并且有移动构造函数和赋值操作符。

其实施方式如下:

代码语言:javascript
复制
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_);
    }
};

现在,我不知道为什么这里要交换数据指针。我觉得应该像

代码语言:javascript
复制
data_ = std::move(other.data_);

我猜使用这个交换仍然可以,因为other实例在移动之后应该处于无效状态。

我的问题是,我是否可以用data_ = std::move(other.data_);替换语句,是否有一些unique_ptr删除的东西,这是执行交换而不是移动的原因,也就是说,如果我做了移动,原始数据会被正确删除吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-15 13:46:13

回答你的问题:

是的,你可以用

代码语言:javascript
复制
data_ = std::move(other.data_);

但如注释所示,如果不实现移动构造函数,只要不实现复制构造函数、复制赋值操作符、移动赋值运算符或析构函数,就会发生这种情况。如果您已经实现了上述功能之一,那么将move构造函数标记为=default也将完成这项工作。

在这种情况下,交换对象的内容确实是不必要的,因为实际上没有什么可交换的,因为这是一个(move)构造函数,this->data_没有指向任何以前分配的内存位置,这些位置应该在指针被覆盖后释放。

因此,在实现移动赋值操作符时,交换通常是完成的,因为在本例中,this->data_通常保存一个指向某个需要释放的内存位置的指针。通过将这个指针放入moved from对象中,它所指向的内存将在调用moved对象的析构函数时释放。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45692747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档