У меня есть следующий упрощенный код, который моделирует переменную, которая может быть целым числом или строкой:
//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;
}
}
};
Когда я вызываю set
из другой точки кода с type=String
, я получаю ошибку сегментации в строке влияния на строку.
#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.
Что я не понимаю ...