当我在阅读 union 体中的构造函数和析构函数时,我遇到了一个堆栈溢出问题 Is a Union Member's Destructor Called
该问题的公认答案是我们需要显式地为字符串对象提供析构函数。但是关于 Deleting string object in C++ 的公认答案,我们不应该显式删除字符串对象,当字符串超出范围时,它的析构函数将被自动调用并释放内存。
这两个是矛盾的。我可以知道即使我们需要如何删除字符串吗?以及我们需要明确删除哪些对象?
根据规范如果 union 的任何非静态数据成员具有非平凡的默认构造函数 (12.1)、复制构造函数 (12.8)、移动构造函数 (12.8)、复制赋值运算符 (12.8)、移动赋值运算符(12.8), or destructor (12.4), union对应的成员函数必须是用户提供的,否则会被隐式删除(8.4.3) for union。但什么是不平凡?
最佳答案
普通的构造函数/析构函数是什么都不做的。本质上,如果你的析构函数看起来像
~Type() {}
那么它就很简单了。 std::string
的析构函数不是那样空的。它必须清理字符串可能分配的所有内存。
因此,由于 union 的析构函数不执行任何操作,但 std::string
需要执行某些操作(否则会发生内存泄漏),因此您必须为 union 提供一个析构函数,该析构函数调用析构函数字符串,以便正确清理。
关于c++ - 如何删除作为 C++ union 的成员变量的字符串对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51622016/