You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何要将被移动对象或右值置空?

为什么移动构造函数要修改被移动对象的状态?

首先最关键的原因:被移动对象的生命周期没结束,最终还是会执行析构函数。如果我们直接“偷走”它的资源(比如示例里的data指针)却不修改它的状态,那新对象和被移动对象的析构函数都会去释放同一块内存,这会触发双重释放的未定义行为,程序大概率会崩溃或者出现不可预料的错误。

比如这个示例里的移动构造函数:

string(string&& that)   // string&& 是string的右值引用
{
    data = that.data;
    that.data = nullptr;
}

把that.data置为nullptr后,被移动对象的析构函数执行时,delete nullptr是完全合法的操作,不会有任何问题,完美避免了双重释放。

其次,标准要求被移动后的对象必须处于有效但未指定的状态:

  • 哪怕调用者说“不再需要”,但万一出现意外误用(比如不小心调用了被移动对象的成员函数),对象得能正常响应,不能直接崩溃。把它置为空串或者nullptr这种有效状态,就能保证这一点。
  • 被移动后的对象必须支持安全执行析构、赋值等核心操作,这是C++语言层面的契约,不能违反。

内容的提问来源于stack exchange,提问作者Amir reza Riahi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:24:46