为何要将被移动对象或右值置空?
为什么移动构造函数要修改被移动对象的状态?
首先最关键的原因:被移动对象的生命周期没结束,最终还是会执行析构函数。如果我们直接“偷走”它的资源(比如示例里的data指针)却不修改它的状态,那新对象和被移动对象的析构函数都会去释放同一块内存,这会触发双重释放的未定义行为,程序大概率会崩溃或者出现不可预料的错误。
比如这个示例里的移动构造函数:
string(string&& that) // string&& 是string的右值引用 { data = that.data; that.data = nullptr; }
把that.data置为nullptr后,被移动对象的析构函数执行时,delete nullptr是完全合法的操作,不会有任何问题,完美避免了双重释放。
其次,标准要求被移动后的对象必须处于有效但未指定的状态:
- 哪怕调用者说“不再需要”,但万一出现意外误用(比如不小心调用了被移动对象的成员函数),对象得能正常响应,不能直接崩溃。把它置为空串或者nullptr这种有效状态,就能保证这一点。
- 被移动后的对象必须支持安全执行析构、赋值等核心操作,这是C++语言层面的契约,不能违反。
内容的提问来源于stack exchange,提问作者Amir reza Riahi
相关产品推荐
相关产品推荐

