【发布时间】:2017-02-27 15:36:47
【问题描述】:
C++11 允许在 union: Member of Union has User-Defined Constructor 中使用标准布局类型
然后我的问题是:当union 超出范围时,我是否保证会调用自定义析构函数?
我的理解是切换时必须手动销毁和构造:http://en.cppreference.com/w/cpp/language/union#Explanation
但是像这样的例子呢:
{
union S { string str;
vector<int> vec;
~S() {} } s = { "Hello, world"s };
}
当s 超出范围时,我是否因为没有调用string 的析构函数而泄漏了堆上分配的字符串的内存?
【问题讨论】:
-
这甚至不能编译。 AFAIK 你需要对这些东西使用placement new 并手动调用构造函数。所以为了保持一致,析构函数也是如此。
-
@Hayt 所以在我编辑之后,这个构造函数将编译:ideone.com/Cf0OOQ 但根据Nathan Oliver's answer 它确实泄漏。
-
我不知道为什么这项作业一开始就有效。这似乎是无意的。但它仍然泄漏。你可以在这里看到
basic_string构造函数被调用,但不是析构函数:godbolt.org/g/2uvrWn -
是的,你应该做什么和必须做什么。它与
{ }分配一起使用的情况似乎是联合的设计缺陷,因为它隐式分配而不是解除分配。 -
我也同意 nathan 是正确的。但如果它有帮助,我可以添加一些解释的答案。
标签: c++ c++11 destructor unions standard-layout