C++11 允许在 union
中使用标准布局类型: 联盟成员具有用户定义的构造函数
然后我的问题是:当 union
超出范围时,我是否保证会调用自定义析构函数?
我的理解是切换时必须手动销毁和构造:http: //en.cppreference.com/w/cpp/language/union#Explanation
但是像这样的例子呢:
{
union S { string str;
vector<int> vec;
~S() {} } s = { "Hello, world"s };
}
当 s
超出范围时,我是否因为没有调用 string
的析构函数而泄漏了在堆上分配的字符串的内存?
原文由 Jonathan Mee 发布,翻译遵循 CC BY-SA 4.0 许可协议
在您提供的示例中
str
不会被破坏。 [class.union]/2 中的标准状态强调我的
因此,由于
str
和vec
都具有重要的特殊成员函数,因此您需要自己为联合提供它们。请注意,根据 bogdan 在空析构函数下方的 评论是不够的。在 [class.union]/8 我们有
所以这个联盟的所有成员都是变种。然后,如果我们查看 [class.dtor]/8 我们有
所以析构函数不会自动销毁联合的成员,因为它们是变体。
你可以像 kennytm 在 这里 做一个带 标签的联合
这确保正确的成员被破坏或只使用
std::variant
或boost::variant