Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
联盟成员分配中的C++分割故障_C++_C++11_Segmentation Fault - Fatal编程技术网

联盟成员分配中的C++分割故障

联盟成员分配中的C++分割故障,c++,c++11,segmentation-fault,C++,C++11,Segmentation Fault,以下代码在分配给联合成员时生成分段错误。这一定是误解工会的结果,但我无法指出我的错误 Q1:是否有必要在T1的构造函数中为适当的union成员变量包含一些初始化 我尝试了类似于下面代码块中建议的解决方案的方法来初始化相应的成员,但没有成功 问题2:如果T1初始化正常,为什么分配到此位置会产生分段错误 相关代码: 结构T1 { T1int类型 { 这个->类型=类型; //Q1:需要在此处初始化适当的联合结构吗?类似于: /* *如果类型==1 *{ *union_member1.str=; *}

以下代码在分配给联合成员时生成分段错误。这一定是误解工会的结果,但我无法指出我的错误

Q1:是否有必要在T1的构造函数中为适当的union成员变量包含一些初始化

我尝试了类似于下面代码块中建议的解决方案的方法来初始化相应的成员,但没有成功

问题2:如果T1初始化正常,为什么分配到此位置会产生分段错误

相关代码: 结构T1 { T1int类型 { 这个->类型=类型; //Q1:需要在此处初始化适当的联合结构吗?类似于: /* *如果类型==1 *{ *union_member1.str=; *} *否则 *{ *union_member2.value=0; *} */ //如果是,还有更好的替代方案吗? } int type;//说明使用了哪个联合结构 协会 { 结构//类型1 { std::字符串str; }工会成员1; 结构//类型2 { int值; }工会成员2; }; }; 结构T2 { 布尔使用; /* *这里还有其他变量 */ }; std::map mymap; T1*全局ptr; int main { 用于自动映射\u条目(&M):mymap { if!map_entry.second.used { 全局_ptr=新的T11; 全局\u ptr->union\u member1.str=map\u entry.first;//问题2:此分配发生SEG错误 std::string s=map_entry.first;//但不使用此赋值 } } } GDB输出 程序接收信号SIGSEGV,分段故障。 标准中的0x00007FF7B70B03::u cxx11::基本字符串::_M_assignstd::u cxx11::基本字符串常量和 来自/usr/lib/x86_64-linux-gnu/libstdc++.so.6 显然,出于可读性的原因,这段代码被删减了。地图条目也经过了彻底验证

表示您可以通过u.x=。。。仅当该赋值是普通赋值运算符时。字符串赋值运算符不是很简单,因此注意事项适用

如果上述规则不适用,则只能通过使用新表达式来更改联合的活动成员

如果字符串直接是工会成员,您可以这样做

    if (type == 1)  
    {
        new (&union_member_str) std::string();
    }
但它是联合成员的子对象,属于未命名的结构类型,因此您可以使用placement new来构造整个结构,并负责其所有子对象:

    if (type == 1)  
    {
        using UMT = decltype(union_member1);
        // or
        // typedef decltype(union_member1) UMT;
        new (&union_member1) UMT();
    }
当然,您还需要在5的复制构造函数、移动构造函数、复制赋值、移动赋值和析构函数规则中进行适当的处理。使用现有类(如std::variant)要好得多

直接字符串成员对应的析构函数片段为

    if (type == 1)  
    {
        union_member_str.string::~string();
    }
对于未命名的结构类型


甚至不要在没有typedef/type别名的情况下编写这些字符串。

std::字符串太复杂,除非您做了大量额外的工作,否则无法存储在联合体中。字符串通过其构造函数、析构函数和特殊成员函数生存和消亡,默认情况下,联合不尊重这些函数。您是否可以使用C++17和?,但它很好地解释了问题,并提供了几种可能的解决方案。如果有人有更好/更新的副本,请提出。我不喜欢用一个C++11之前版本的副本来结束这个问题,它说这根本无法完成;你在大约3分钟内指出了这个问题。非常感谢你的帮助!然而,我被锁定在c++11中。工会的使用是一种幻想,所以我能够移动东西只是一点点,没有更多的SEG故障。我也很想看到一个更先进的解决方案。只有C++11可以使用,或者更可能这是一种你需要自己开发解决方案的任务。在这种情况下,要搜索的关键字被标记为union。请参见中的结构图。它展示了如何设置除联合的安全复制之外的所有内容
    if (type == 1)  
    {
        using UMT = decltype(union_member1);
        union_member1.UMT::~UMT();
    }