背景
手写移动构造时,转移指针只做了一半。被移动对象后续仍会析构,目标对象也可能参与容器重分配。
核心判断
- 移动后源对象保持可析构、可赋值的不变量。
- 移动赋值先释放目标资源,并处理自移动策略。
- 只有所有操作确实不会抛异常时才承诺 noexcept。
最小示例
下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。
Buffer(Buffer&& other) noexcept : data_(std::exchange(other.data_, nullptr)), size_(std::exchange(other.size_, 0)) {}
边界与误区
示例是 Buffer 类内部的构造函数片段。能用 unique_ptr 或标准容器表达所有权时,优先遵循 Rule of Zero,减少手写特殊成员函数。
验证方式
覆盖空对象、非空对象、容器扩容、移动赋值和源对象析构,配合 AddressSanitizer 检查双重释放与泄漏。
小结
先定义资源不变量,再实现移动构造和赋值,保证 moved-from 对象可析构、可赋值。