C++ 如果由唯一_锁管理的互斥锁被破坏了怎么办? void Fn(){ std::mutex*mutex=新std::mutex; std::唯一锁(*互斥锁); 删除互斥; }
上面的代码段中是否有未定义的行为?是的,当然有未定义的行为。锁的析构函数将尝试调用C++ 如果由唯一_锁管理的互斥锁被破坏了怎么办? void Fn(){ std::mutex*mutex=新std::mutex; std::唯一锁(*互斥锁); 删除互斥; },c++,c++11,mutex,C++,C++11,Mutex,上面的代码段中是否有未定义的行为?是的,当然有未定义的行为。锁的析构函数将尝试调用mutex->unlock(),这将取消对无效指针的引用。甚至在锁的析构函数运行之前,您就已处于UB区域。§30.4.1.2.1[线程.mutex.class]/p5: 如果程序破坏互斥对象,则程序的行为是未定义的 由任何线程拥有,或者线程在拥有互斥锁时终止 反对 void Fn() { std::mutex* mutex = new std::mutex; std::unique_lock<std:
mutex->unlock()
,这将取消对无效指针的引用。甚至在锁的析构函数运行之前,您就已处于UB区域。§30.4.1.2.1[线程.mutex.class]/p5:
如果程序破坏互斥对象,则程序的行为是未定义的
由任何线程拥有,或者线程在拥有互斥锁时终止
反对
void Fn() {
std::mutex* mutex = new std::mutex;
std::unique_lock<std::mutex> lock(*mutex);
delete mutex;
}