在C ++中复制RAII对象

时间:2017-12-11 01:49:50

标签: c++ raii

我正在阅读有效的C ++,在Rule 14: Think carefully about copying behavior in resource-managing classes中,有一个例子:

class Lock {
  public:
    explicit Lock(Mutex* pm) : mutexPtr(pm) {
      lock(mutexPtr);
    }
    ~Lock() {
      unlock(mutexPtr);
    }
  private:
    Mutex *mutexPtr;
};

它指出如果我们如上所述构建Lock,如果我们运行以下代码就会出现问题:

Mutex m;
Lock ml1(&m);
Lock ml2(ml1);

我认为这可能是因为代码可能如下所示:

// ml1 constructes
lock(m)
// copy ml2, but ml1.mutexPtr and ml2.mutexPtr both point to m
ml2.mutexPtr = ml1.mutexPtr
// ml1 destructs
unlock(m)
// ml2 destructs
unlock(m)

所以m将解锁两次。那么导致下面问题的真正原因是什么? THX!

1 个答案:

答案 0 :(得分:0)

是的,这就是作者说要小心的原因。如果你使用recursive_mutex而不是普通的互斥锁,你可以简单地锁定copy ctor和copy-assign运算符,但如果它是非递归互斥锁,那么使锁类型不可复制可能会更好。