如果由unique_lock管理的互斥锁被破坏怎么办?

时间:2014-08-25 22:40:24

标签: c++ c++11 mutex

void Fn() {
  std::mutex* mutex = new std::mutex;
  std::unique_lock<std::mutex> lock(*mutex);
  delete mutex;
}

上面的代码段中是否存在未定义的行为?

2 个答案:

答案 0 :(得分:4)

是的,当然有未定义的行为。锁的析构函数将尝试调用mutex->unlock(),这将取消引用无效指针。

答案 1 :(得分:4)

即使在锁的析构函数运行之前,您仍处于UB区域。 §30.4.1.2.1[thread.mutex.class] / p5:

  

如果程序破坏了mutex对象,则该程序的行为是未定义的   由任何线程或线程拥有,在拥有mutex时终止   对象