在类的联合内部访问映射会产生分割错误
Accessing map inside union inside class gives segmentation fault
我正在尝试创建一个包含一种类型或另一种类型的映射的类,因此我决定使用匿名联合。但是当我试图访问映射时,我的代码给出了一个分段错误(在这种情况下,我在构造函数和析构函数中都得到了一个分段错误):
#include <map>
#include <string>
#include <iostream>
class Foo
{
private:
union
{
std::map<std::string, int> ints;
std::map<std::string, std::string> strings;
};
bool fooContainsInts;
public:
Foo(bool containsInts) : fooContainsInts(containsInts)
{
if (containsInts) {ints = std::map<std::string, int>();}
else {strings = std::map<std::string, std::string>();}
}
~Foo()
{
if (fooContainsInts) {ints.clear();}
else {strings.clear();}
}
};
int main()
{
std::cout << "No segfault here!" << std::endl;
Foo foo(true);
std::cout << "This line doesn't get printed" << std::endl;
return 0;
}
我建议模板化类型而不是联合,但这可能会对您有所帮助。
http://en.cppreference.com/w/cpp/language/union第二个例子向您展示了如何处理非pod联合成员。
应该是这样的
Foo(bool containsInts) : fooContainsInts(containsInts)
{
if (containsInts) { new (&ints) std::map<std::string, int>;}
else { new (&strings) std::map<std::string, std::string>;}
}
~Foo()
{
if (fooContainsInts) { ints.~map<std::string, int>(); }
else { strings.~map<std::string, std::string>(); }
}
我现在不能在MSCV上测试它。
您需要显式地构造和析构非pod联合类型
包括std::map
类型在内的大多数STL容器都不能在联合中,因为它具有"非平凡"成员函数。关于什么可以和什么不能在union中存在的更多信息,请参阅wiki。
union用于在多个数据类型之间共享内存。注意,std::map
容器将堆分配存储每个节点实际数据所需的内存。
相关文章:
- C++映射分割错误(核心转储)
- 由cin中的字符串中未捕获空白引起的分割错误
- 删除映射和分割错误中的一个过去结束元素
- 在指向函数中读取变量时出现分割错误
- 在链表中的第 n 位插入显示分割错误
- 较高值 n 的分割错误(例如 n=999997)
- 尝试通过memcpy复制大尺寸浮点向量时的分割错误
- 分割错误:向量中的擦除功能
- 向量向量的分割错误
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 分割错误 11:尝试使用 cin 输入 B[1] 时
- 集合布局上的 Qt 分割错误
- 高达20亿的筛子会产生分割错误
- 对向量使用推回函数时的分割错误
- 绘制精灵会导致分割错误
- 将矢量的整数内容打印为字符串会导致分割错误
- 分割错误:使用向量时为 11 c++
- 结构的分割错误错误