void foo()
{
ScopedLock(this->mutex); // Oops, should have been a named object.
// Edit: added the "this->" to fix compilation issue.
// ....
}
为了防止情况再次发生,他在定义ScopedLock类后创建了以下宏:
#define ScopedLock(...) Error_You_should_create_a_named_object;
这个补丁工作正常。
有没有人知道任何其他有趣的技术来防止这个问题?
答案 0 :(得分:8)
您应该使用静态代码分析器,例如Cppcheck。对于以下代码:
class a { };
void f() {
a();
}
cppcheck生成以下输出:
$ cppcheck test.cpp
Checking test.cpp...
[test.cpp:4]: (error) instance of "a" object destroyed immediately
还检测到各种其他常见编码错误。
(我是Cppcheck的一个相当新的贡献者。几个月前我发现了它并且使用它很棒。)
答案 1 :(得分:3)
如果你要定义一个宏,我可能宁愿定义一个:
#define GET_SCOPED_LOCK(name, mtx) ScopedLock name(mtx)
并停止创建除宏之外的对象。
如果有帮助,请将ScopedLock
重命名为ThisClassNameShouldNotAppearInUserCode
。