gpt4 book ai didi

c++ - 标记 union 内字符串影响的段错误

转载 作者:行者123 更新时间:2023-11-27 22:36:40 27 4
gpt4 key购买 nike

我有以下简化的代码来模拟可以是整数或字符串的变量:

//tagged union
union VariableValueType {
std::int64_t i;
std::string s;

VariableValueType(void): i(0) {}
~VariableValueType(void) {}
};
enum class VariableType {Undefined, Integer, String};

class Variable
{
VariableValueType _value;
VariableType _type;

//constructor from a string
Variable(const VariableType type, const std::string& value)
: _type(VariableType::Undefined)
{
set(type,value);
}

// setter
void set(const VariableType type, const std::string& value)
{
switch(type)
{
case VariableType::Integer :
_value.i = std::stoi(value);
_type = VariableType::Integer;
break;
case VariableType::String :
_value.s = value; //<-- crashes here!!!
_type = VariableType::String;
break;
}
}
};

当我使用 type=String 从代码中的另一个点调用 set 时,我在字符串影响行上遇到了段错误。

#0  0x00007ffff7b70c73 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#1 0x00007ffff7b70f89 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#2 0x00005555556c3fdd in Variable::set (this=0x5555559d7ae0, type=VariableType::String, value="1") at /home/.../Variable.cpp:118

我不知道这里发生了什么......

有趣的事实:如果我将 std::string foo = value; 添加为 set 方法的第一行,那么段错误就会消失...


编辑:

当我向 gdb 询问 _value.s 的值时,我收到以下消息:

error reading variable: Cannot create a lazy string with address 0x0, and a non-zero length.

我不明白...

最佳答案

不要在 union 中使用字符串。不要在 union 中使用任何非 POD 的对象(因此使用构造函数/析构函数)。

原因是您的构造函数不会被调用,这意味着该对象将处于未定义状态。

改用 std::variant(如果您没有 C++17,则使用 boost::variant)。

关于c++ - 标记 union 内字符串影响的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53254137/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com