关于RAII:如何防止意外创建临时错误?

时间:2011-03-01 18:55:33

标签: c++

一段时间,一位同事告诉我,他花了很多时间来调试竞争条件。罪魁祸首竟然是这样的:

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;

这个补丁工作正常。

有没有人知道任何其他有趣的技术来防止这个问题?

2 个答案:

答案 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