4

在移动赋值运算符中调用 d-tor 是一种好习惯吗?

这里有一些示例代码:

VectorList &operator = (VectorList &&other){
    ~VectorList(); // if this is not a good practice,
                   // I will need to paste whole d-tor here.

    _buffer     = std::move(other._buffer       );
    _dataCount  = std::move(other._dataCount    );
    _dataSize   = std::move(other._dataSize     );

    other._clear();

    return *this;
}

我应该使用这段代码,还是应该将 swap() 与移动构造的对象一起使用?

4

2 回答 2

5

~VectorList不仅仅是在 dtor 主体中运行代码:它实际上破坏了对象。

之后,该存储空间未被使用。您可以使用构造函数在那里构造一个新对象,但简单地访问成员将是未定义的行为,或者需要语言律师找到允许定义它的漏洞。

即使定义了它也是危险的,因为在销毁自动存储对象时抛出的异常是坏消息。另外,如果分配给的类实际上是派生类型,则 dtor 调用本身就是 UB!

两者都不是一个值得的方法。好处太小了。

更好的选择是复制交换(这至少很容易纠正:它可以防止一些优化),或者从 dtor 和赋值中重构出“清晰”的代码。然后在两个地方调用它。

于 2015-09-26T12:16:37.633 回答
2

Scott Meyers 说不要使用swap()http ://scottmeyers.blogspot.sg/2014/06/the-drawbacks-of-implementing-move.html

关于您当前的实现,您似乎可以更简单地做到这一点。我想析构函数实际上删除_buffer并且几乎没有做其他事情。如果这是真的,你应该用delete _buffer.

于 2015-09-26T11:42:09.127 回答