在移动分配操作员内部调用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()与移动构造对象一起使用?
答案 0 :(得分:5)
~VectorList
不仅仅是在dtor体中运行代码:它实际上会破坏对象。
之后,存储空间未使用。您可以使用构造函数在那里构造一个新对象,但只是访问成员将是未定义的行为,或者需要语言律师找到允许它被定义的漏洞。
即使已定义,也很危险,因为在销毁自动存储对象时抛出的异常是坏消息。另外,如果指定的类实际上是派生类型,则dtor调用本身就是UB!
这两种方法都不值得。好处太小了。
更好的选择是复制交换(至少容易纠正:它可以阻止一些优化),或者重构“清除”。来自dtor和赋值的代码。然后在两个地方打电话。
答案 1 :(得分:2)
Scott Meyers说不要使用swap()
:http://scottmeyers.blogspot.sg/2014/06/the-drawbacks-of-implementing-move.html
关于您当前的实施,似乎您可以更简单地做到这一点。我认为析构函数实际上删除了_buffer
而没有做其他事情。如果这是真的,那么你应该用delete _buffer
替换你更难理解的显式析构函数。