0

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

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

代码:

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;

    }


}
4

1 回答 1

1

假设UINT64 time;应该是UINT64 timestamp;...

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

至于如何管理指针:由 union ( A) 的用户决定。联合本身无法知道它是否包含指针或时间戳,也无法知道指针是如何分配的。据我从您发布的代码中可以看出,联合从不包含指针,并且可以直接替换为UINT64 timestamp;. 这将是最好的解决方案,除非它比你展示的更多。

于 2013-07-24T14:46:09.850 回答