可以在move赋值操作符中调用析构函数吗?
can I call destructor in move assignment operator?
调用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()与移动构造对象?
~VectorList
不仅运行医生体中的代码:它实际上破坏了对象。
之后,存储空间未使用。你可以在那里使用构造函数构造一个新对象,但是简单地访问成员要么是未定义的行为,要么需要语言专家找到允许它被定义的漏洞。
即使定义了,它也是危险的,因为在自动存储对象销毁时抛出异常是坏消息。另外,如果被赋值的类实际上是派生类型的,那么医生调用本身就是UB!
这两种方法都不值得。好处太少了。
更好的选择是拷贝交换(这至少很容易得到正确的:它可以防止一些优化),或者重构从博士和赋值中"清除"代码。
Scott Meyers说不要使用swap()
: http://scottmeyers.blogspot.sg/2014/06/the-drawbacks-of-implementing-move.html
关于你目前的实现,似乎你可以做得更简单。我想象析构函数实际上删除了_buffer
,并没有做任何其他事情。如果这是真的,您应该用delete _buffer
替换您的难以解释的显式析构函数调用。
相关文章:
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常