由于引发异常时,确保运行的唯一代码是析构函数,因此此类代码可能会产生内存泄漏
std::mutex foo;
foo.lock();
// My code which might throw an exception
foo.unlock();
这是一种最佳做法吗,还是还有其他更好的选择? 这个想法是利用RAII的优势,以确保在引发异常时互斥体不会被释放。
std::mutex foo;
{
std::lock_guard<std::mutex>(foo);
// My code which might throw an exception
}
答案 0 :(得分:12)
这是最佳做法吗?
std::mutex foo; { std::lock_guard<std::mutex>(foo); // My code which might throw an exception }
否!您将在此处创建一个未命名的临时变量,其生存期在该行的结尾处结束。相反,请确保该对象具有名称,以使其寿命符合其范围。
std::mutex foo;
{
std::lock_guard<std::mutex> NEVER_FORGET_THIS_NAME(foo);
// My code which might throw an exception
}
但是,除此之外,通常-是的,在这种情况下,使用RAII是一个好习惯。还要注意,未命名的锁卫程序错误并不少见,请看here。
答案 1 :(得分:0)
始终使用lock_guard
确保互斥量将被释放。