我遇到了 std::swap 的问题。我必须交换一个对象。该对象在其析构函数中释放内存。我已经编写了一个 move 构造函数和一个将指针复制到该内存的 move 赋值运算符。默认构造函数将该指针设置为 NULL。
当然,我有一个常规的复制构造函数和赋值运算符,但它们分配和复制内存,这显然不是我想要的交换操作。
当我调用 std::swap 时,它使用我的 move 构造函数从 _Left 创建一个临时对象。然后,它使用我的 move 赋值运算符将 _Right move 到 _Left,最后,它将临时对象 move 到 _Right。
当你到达 std::swap 的底部时,这一切看起来都很好。但是,当您走出它的底部时,temp 对象的析构函数将运行,释放 _Right 对象期望拥有的内存。
通常接受的方法是什么?我希望避免编写交换函数,因为那是 move 构造函数/move 赋值运算符的要点。我是否必须使用自己的 swap() 来避免这种情况?
最佳答案
move 操作应该使被 move 的对象处于可破坏状态,这可能与它进入 move 时的状态不同。
如果我对问题的理解是正确的,那么听起来您的对象的 move 构造函数需要将要 move 的对象中的指针设置为不同于它们附带的值的指针。那些现在 move 的对象的后续 dtor 应该单独保留它们曾经引用的内存。
关于c++ - std::swap 中不需要的析构函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26941370/