☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

对象被移动后应重置状态再使用

2.10 ID_useAfterMove
目录 › next › previous

对象被移动后在逻辑上不再有效,如果没有通过清空数据或重新初始化等方法更新对象的状态,不应再使用该对象。

示例:

#include <vector>

using V = std::vector<int>;

void foo(V& a, V& b)
{
    a = std::move(b);   // After moving, the state of ‘b’ is unspecified
    b.push_back(0);     // Non-compliant
}

例中容器 b 的数据被移动到容器 a,可能是通过交换的方法实现的,也可能是通过其他方法实现的,标准容器被移动后的状态在 C++ 标准中是未声明的,程序不应依赖未声明的状态。

应改为:

void foo(V& a, V& b)
{
    a = std::move(b);
    b.clear();          // Clear
    b.push_back(0);     // Compliant
}

相关

ID_unsuitableMove

依据

ISO/IEC 14882:2011 17.6.5.15(1)-unspecified ISO/IEC 14882:2017 20.5.5.15(1)-unspecified

参考

C++ Core Guidelines ES.56 SEI CERT EXP63-CPP
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.