在union中使用指针的正确方法是什么(例如,分配和释放内存)?还是可能的?

时间:2013-07-24 14:29:02

标签: c++

我正在尝试修复其他人编写的旧项目中的错误。以下是我正在使用的代码的一部分。

有些事情我不清楚联合中指针的用法。联合中指针指向的内存如何释放?我应该为指针分配内存吗?另外我认为它们是代码的其他问题,请指出它们。非常感谢!

代码:

class A
{
    long filePos; 

    union EU
    {

        float *recording;
        UINT64 timeStamp; 

        EU(): timeStamp((UINT64)0)  //should I allocate memory here?
        {
        }

        EU(const EU& eu)            
        {
            if(eu.timeStamp)       //is this the way to check which field of union is used currently?
                timeStamp = eu.timeStamp;
            else
                recording = eu.recording;


        }

        EU& operator=(const EU& eu)
        {
            if(this == &eu)
                return *this;

            if(eu.timeStamp)
                timeStamp = eu.timeStamp;
            else
                recording = eu.recording;


            return *this;
        }

        EU(UINT64 ts):timeStamp(ts)
        {   
        }

        ~EU()            
        {

        }

    }EU;
    public :
    inline A(long fpos, UINT64 ts) :filePos(fpos),EU(ts)
    {
    }

    inline A(const EDFItem & ei)
    {
        filePos = ei.filePos;
        EU=ei.EU;
    }


    ~A ()
    {

    }

    inline A& operator=(const A& ei)
    {
        if(this == &ei)
            return *this;
        filePos = ei.filePos;
        EU=ei.EU;

        return *this;

    }


}

1 个答案:

答案 0 :(得分:1)

假设UINT64 time;应为UINT64 timestamp; ...

代码有很多问题。如果EU::recording成立 一个有效的指针,EU::timestamp也将是非空的,并且 反之亦然。 (可能是:在32位大端机器上,一个小的 足够的时间戳不会导致recording非空。) 复制构造函数和赋值运算符是多余的 并且令人困惑,因为上次初始化类型的测试是 不正确。他们会工作,但更多的是机会而不是其他任何东西。 并且不需要自我分配的测试。 (如果你 需要它们,赋值运算符可能不是线程 安全,但你不需要它们。)

至于如何管理指针:由用户决定 联盟(A)。工会本身无法知道是否 它包含指针或时间戳,并且无法知道 如何分配指针。据我所知 你发布的代码,联盟从不包含指针, 并且可以由UINT64 timestamp;直接替换。哪一个 将是最好的解决方案,除非它比你更多 秀。