在析构函数中保存std :: lock_guard是否安全?

Jon*_*ung 5 c++ multithreading destructor

我试图确定以下代码是否安全,或者是否为UB并且仅在这种情况下可以正常工作(在此处运行):

#include <iostream>
#include <mutex>

struct Foo
{
  std::mutex mutex;
  ~Foo()
  {
    std::lock_guard<std::mutex> lock(mutex);
  }
};

int main() 
{
  {
    Foo foo;
  }
  std::cout << "everything seems to work fine...?" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

具体来说,我们是否可以保证在析构函数内部定义的局部变量在成员变量之前被解构?

我从cppreference.com找到了以下内容,但似乎无法完全回答我的问题:

破坏顺序

对于用户定义或隐式定义的析构函数,在执行析构函数的主体之后,编译器将以声明的相反顺序为该类的所有非静态非变量成员调用析构函数,然后调用的析构函数。所有直接的非虚拟基类,其构造顺序相反(依次调用其成员及其基类的析构函数,等等),然后,如果此对象属于派生类最多的对象,则它将调用所有虚拟基类的析构函数基地。

Bri*_*ian 8

根据[class.dtor] / 9中的标准,

在执行了析构函数的主体并销毁了主体中分配的所有自动对象后,用于类X的析构函数调用X的直接非变量非静态数据成员的析构函数,X的非虚拟直接基类的析构函数,以及如果X是最派生类(15.6.2)的类型,则其析构函数调用X的虚拟基类的析构函数。...

这肯定回答了您的问题。