在C ++中,有没有权威的方法可以防止“移动后使用”错误?

时间:2019-03-13 13:59:37

标签: c++ c++11

我发现这些错误对于开发人员来说太容易了。是否有最佳实践或权威方法来避免这种情况?是否有可在多个平台上使用的编译器标志或提示?

3 个答案:

答案 0 :(得分:3)

有效的经验法则:永远不要使用std::movestd::forward,也不要将类型强制转换为右值(或通用)引用。如果您从不从变量或引用中移出,那么以后就不会犯错误。这种方法显然有一个缺点,因为在某些情况下,这些实用程序可用于在移动足够时将副本转换为移动。更不用说有必要的情况了。

适合您自己的类型的方法:将断言添加到成员函数中,以验证实例是否已从中移出,并在测试期间依靠它们来触发。 “移动”状态将需要存储为成员。断言和成员可以在发布版本中删除。缺点是,这给每个成员函数增加了不必要的样板。

另一种方法:使用静态分析工具尝试检测潜在的错误。

合理的经验法则:保持功能简短。当该函数简短时,用法将很接近移动,因此潜在错误更容易发现。

答案 1 :(得分:2)

因此,问题确实出在移动之后。我认为我同意将std :: move的任何使用作为潜在风险进行代码审查。如果std :: move位于带有局部值或value参数的函数的末尾,则一切正常。

还有其他需要检查的地方,在移动之后对变量的任何使用都应引起注意。我猜给变量加上“ _movable”后缀也将有助于代码审查。

在审查过程中,仅需辩护一些先写后换的情况,例如交换。

我个人仍然将std :: move视为代码中的一种气味,就像强制转换一样。

我不确定会实施这种模式的任何皮棉规则,但我确定它们很容易编写:-)

答案 2 :(得分:1)

禁止std::move是近视的。避免移动后读取的最佳方法是在引入移入变量的作用域末尾移至std::move