c++ - 在析构函数中保存 std::lock_guard 是否安全?
问题描述
我正在尝试确定以下代码是否安全,或者它是否是 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;
}
具体来说,我们是否保证在析构函数中定义的局部变量会在成员变量之前被破坏?
我从cppreference.com找到了以下内容,但它似乎并没有完全回答我的问题:
破坏顺序
无论是用户定义的还是隐式定义的析构函数,在析构函数体执行完毕后,编译器都会为类的所有非静态非变体成员调用析构函数,按照声明的相反顺序,然后调用析构函数的析构函数。所有直接非虚拟基类以相反的构造顺序(依次调用其成员及其基类的析构函数等),然后,如果该对象属于最派生类,则它调用所有虚拟的析构函数基地。
解决方案
根据 [class.dtor]/9 中的标准,
在执行析构函数的主体并销毁主体内分配的任何自动对象后,类
X
的析构函数调用X
的直接非变体非静态数据成员的析构函数、X
非虚拟直接基类的析构函数,以及, ifX
是最派生类的类型(15.6.2),它的析构函数调用X
的虚拟基类的析构函数。...
这肯定地回答了你的问题。
推荐阅读
- powershell - 何时评估数据部分?
- c++ - 如何使用 Eigen 和 bazel 构建一个简单的 C++ 演示?
- google-maps - 在 Flutter Google Maps Plugin 的 Marker _icon 下放置自定义文本
- alert - 可以对数据狗中的消息模板变量进行等式匹配吗?
- react-native - expo-av 裸错误:缺少录音权限
- r - 如何使用 2 个不同的条件将字符串(在一列中)拆分为 2 个单独的列,并且只保留这 2 个列?
- excel - 在 vba 中编辑/更新现有行数据
- python - 将整数字符串列表转换为整数数组的最有效方法
- python - 将 Python 输出管道传输到 NetCat - time.sleep() 会中断输出?
- python - 2列的唯一值不在另一列