如何在移动分配运算符中调用析构函数?

缺口

在移动分配运算符内部调用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()?

Yakk-亚当·内夫罗蒙特

~VectorList 除了在dtor主体中运行代码外,它的作用还不止于此:它实际上破坏了对象。

此后,该存储将不被使用。您可以使用构造函数在那里构造一个新对象,但是简单地访问成员将要么是未定义的行为,要么是要求语言律师查找允许对其进行定义的漏洞。

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

也不是一个值得的方法。好处太小了。

更好的选择是复制交换(至少易于纠正:它可以阻止某些优化),或者从dtor和分配中重构出“清晰”的代码。然后在两个位置都调用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

取消运算符delete []中的析构函数调用

来自分类Dev

在赋值运算符之前调用的结构的析构函数

来自分类Dev

从赋值运算符调用析构函数是否有任何意外的后果?

来自分类Dev

std :: swap在构造函数,赋值运算符和析构函数方面如何工作?

来自分类Dev

何时使用:类析构函数或删除运算符

来自分类Dev

类析构函数导致重载+运算符的问题

来自分类Dev

来自libc ++的istringstream析构函数中对运算符delete的未定义引用

来自分类Dev

基于策略的类中的策略转换运算符与私有析构函数

来自分类Dev

在派生类中定义析构函数需要复制赋值运算符

来自分类Dev

如何在链表中对析构函数进行递归调用?

来自分类Dev

移动分配运算符未被调用

来自分类Dev

移动分配运算符中的异常

来自分类Dev

vector :: clear如何在不丢失分配的内存的情况下调用析构函数

来自分类Dev

如何在不调用析构函数的情况下使向量重新分配?

来自分类Dev

vector :: clear如何在不丢失分配的内存的情况下调用析构函数

来自分类Dev

复制构造函数,赋值运算符和析构函数代码重复

来自分类Dev

如果我还使用复制构造函数和重载=运算符,是否需要析构函数?

来自分类Dev

重载delete []运算符,以允许使用析构函数缩小类型的数组

来自分类Dev

具有虚拟和非虚拟析构函数的删除运算符的不同行为

来自分类Dev

如何在C ++中从外部函数调用删除运算符?

来自分类Dev

如何在运算符+ =中调用运算符+

来自分类Dev

如何在自己的赋值运算符中调用默认赋值运算符?

来自分类Dev

如何在Turbo C ++中显式调用类的析构函数

来自分类Dev

如何在不调用析构函数的情况下将值从std:optional中移出?

来自分类Dev

如何在Elixir中动态调用运算符

来自分类Dev

如何在C ++中调用模板运算符[]?

来自分类Dev

在不调用析构函数、复制或移动的情况下初始化(分配)内存

来自分类Dev

如何理解CPP中的调用析构函数方法?

来自分类Dev

如何为指针分配析构函数?

Related 相关文章

  1. 1

    取消运算符delete []中的析构函数调用

  2. 2

    在赋值运算符之前调用的结构的析构函数

  3. 3

    从赋值运算符调用析构函数是否有任何意外的后果?

  4. 4

    std :: swap在构造函数,赋值运算符和析构函数方面如何工作?

  5. 5

    何时使用:类析构函数或删除运算符

  6. 6

    类析构函数导致重载+运算符的问题

  7. 7

    来自libc ++的istringstream析构函数中对运算符delete的未定义引用

  8. 8

    基于策略的类中的策略转换运算符与私有析构函数

  9. 9

    在派生类中定义析构函数需要复制赋值运算符

  10. 10

    如何在链表中对析构函数进行递归调用?

  11. 11

    移动分配运算符未被调用

  12. 12

    移动分配运算符中的异常

  13. 13

    vector :: clear如何在不丢失分配的内存的情况下调用析构函数

  14. 14

    如何在不调用析构函数的情况下使向量重新分配?

  15. 15

    vector :: clear如何在不丢失分配的内存的情况下调用析构函数

  16. 16

    复制构造函数,赋值运算符和析构函数代码重复

  17. 17

    如果我还使用复制构造函数和重载=运算符,是否需要析构函数?

  18. 18

    重载delete []运算符,以允许使用析构函数缩小类型的数组

  19. 19

    具有虚拟和非虚拟析构函数的删除运算符的不同行为

  20. 20

    如何在C ++中从外部函数调用删除运算符?

  21. 21

    如何在运算符+ =中调用运算符+

  22. 22

    如何在自己的赋值运算符中调用默认赋值运算符?

  23. 23

    如何在Turbo C ++中显式调用类的析构函数

  24. 24

    如何在不调用析构函数的情况下将值从std:optional中移出?

  25. 25

    如何在Elixir中动态调用运算符

  26. 26

    如何在C ++中调用模板运算符[]?

  27. 27

    在不调用析构函数、复制或移动的情况下初始化(分配)内存

  28. 28

    如何理解CPP中的调用析构函数方法?

  29. 29

    如何为指针分配析构函数?

热门标签

归档