我正在实现一个使用匿名联合QVariant
调用的类:Variant
class Variant
{
public:
// …
~Variant();
// …
private:
Type _type;
union
{
int _int;
uint64_t _uint64;
float _float;
void* _ptr;
};
};
尝试Variant::~Variant()
删除Variant::_ptr
成员时会出现段错误String*
:
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
它无法访问的部分。但为什么?