C++ 移动语义审查:先问资源所有权,再看 std::move
背景 手写移动构造时,转移指针只做了一半。被移动对象后续仍会析构,目标对象也可能参与容器重分配。 核心判断 移动后源对象保持可析构、可赋值的不变量。 移动赋值先释放目标资源,并处理自移动策略。 只有所有操作确实不会抛异常时才承诺 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 对象可析构、可赋值。