【发布时间】:2019-06-18 08:57:21
【问题描述】:
因为当抛出异常时,唯一能确保运行的代码是析构函数,这样的代码可能会产生内存泄漏
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
}
【问题讨论】:
-
嗯,通常这是最佳实践。如果你想在作用域结束之前解锁它,你可以改用
std::unique_lock,但是手动管理互斥锁没有任何好处(除了头痛和错误)。 -
std::lock_guard<std::mutex>(foo);不会保护任何东西,因为未命名的临时变量会立即被销毁,因此当互斥锁未锁定时,// My code将被执行。