void Fn() {
std::mutex* mutex = new std::mutex;
std::unique_lock<std::mutex> lock(*mutex);
delete mutex;
}
上面的代码段中是否存在未定义的行为?
答案 0 :(得分:4)
是的,当然有未定义的行为。锁的析构函数将尝试调用mutex->unlock()
,这将取消引用无效指针。
答案 1 :(得分:4)
即使在锁的析构函数运行之前,您仍处于UB区域。 §30.4.1.2.1[thread.mutex.class] / p5:
如果程序破坏了
mutex
对象,则该程序的行为是未定义的 由任何线程或线程拥有,在拥有mutex
时终止 对象