c++ - 如何删除作为 C++ union 的成员变量的字符串对象?

标签 c++ string language-lawyer destructor unions

当我在阅读 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/

相关文章:

string - 实现字典的最佳数据结构?

r - 将单列拆分为四列并计算 R 中的重复模式

c - 反转字符串的最短 C 代码

c++ - 匹配 bool vs const void* 重载的函数的地址

c++ - C++中的删除

c++ - 如何正确组合类型别名、函数指针和模板函数

C++ 将文本文件读入 vector < vector >,然后根据内部 vector 中的第一个单词写入 vector 或数组

java - 允许整数数字之间使用下划线的理由是什么?

c++ - 如何在静态析构函数中安全地使用 `std::error_category`?

c++ - 给定一个从 0 到 n 的整数 vector ,但不是全部包含在内,我如何有效地获取未包含的整数?