c++ - std::swap 中不需要的析构函数调用

标签 c++ c++11 stl move

我遇到了 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/

相关文章:

c++ - 错误 C2086 : redefinition

c++ - 有没有可能让类型具有在容器中抛出的移动操作?

c++ - 将 mem_fun 存储在标准容器中

c++ - 如何使用 `is_member_function_pointer` 包含/排除算法中的成员函数调用?

c++ - 使用构造函数初始化 STL 映射

c++ - 使用 C++ 在 Windows 上获取 ssl 证书

c++ - 英特尔 SIMD - 如何检查 __m256* 是否包含任何非零值

c++ - 从位图读取 RGB - (RGB) 值错误;由 小码哥发布于

c++ - 在 C++ 中使用可变参数模板迭代参数包

c++ - 包装的 lambda 表达式