我正在实现一个类似于 QVariant
的类,名为 Variant
,使用匿名联合:
class Variant
{
public:
// …
~Variant();
// …
private:
Type _type;
union
{
int _int;
uint64_t _uint64;
float _float;
void* _ptr;
};
};
在尝试删除String*
时,在Variant::~Variant()
中出现段错误,原因是尝试删除Variant::_ptr
成员。
Variant::~Variant()
{
if (_type == Type::String)
delete reinterpret_cast<String*>(_ptr);
else if (_type == Type::Date)
delete reinterpret_cast<Date*>(_ptr);
// …
}
这是分配的方式:
Variant::Variant(const String& str)
: _type(Type::String),
_ptr(new String(str))
{}
有趣的是,在GDB中,对于析构函数的栈帧,我无法访问联合成员,但我可以访问Variant::_type
成员。
(gdb) frame
#0 0x0000000000527700 in Variant::~Variant (this=0x7fffec0337a0, __in_chrg=<optimized out>) at Sources/Types/Variant.cpp:85
85 delete reinterpret_cast<String*>(_ptr);
(gdb) p _ptr
No symbol "_ptr" in current context.
(gdb) p _int
No symbol "_int" in current context.
(gdb) p _float
No symbol "_float" in current context.
(gdb) p _type
$2 = Variant::String
看起来联合已经被删除了,因此,在尝试删除 _ptr
时会发生段错误,因为无法访问它。但是为什么会这样呢?
p this->_ptr
会发生什么? - Mats PeterssonBoost.Variant
。这是一个干净、高效的实现,具有适当的类型安全 API。通常不建议使用不安全类型的 variant,但如果需要的话,可以考虑使用Boost.Any
,它提供了一个干净、高效、可用的实现。 - Konrad Rudolphthis->_ptr
访问成员,但仍然会出现段错误。@LucDantonString
没有用户定义的复制构造函数,该类私有继承自std::string
。 - lesenk