3

我正在实现一个使用匿名联合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它无法访问的部分。但为什么?

4

1 回答 1

3

我的心理调试能力告诉我,您没有实现自己的复制构造函数,默认的只是复制指针而不是分配新内存。然后,当原始副本被破坏时,会导致双重删除。

但除非这只是一个练习,boost::variant或者boost::any因为它们已经是强大的开发良好的解决方案。

于 2013-06-10T12:44:23.823 回答