我正在尝试修复其他人编写的旧项目中的错误。以下是我正在使用的代码的一部分。
有些事情我不清楚联合中指针的用法。联合中指针指向的内存如何释放?我应该为指针分配内存吗?另外我认为它们是代码的其他问题,请指出它们。非常感谢!
代码:
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;
}
}
答案 0 :(得分:1)
假设UINT64 time;
应为UINT64 timestamp;
...
代码有很多问题。如果EU::recording
成立
一个有效的指针,EU::timestamp
也将是非空的,并且
反之亦然。 (可能是:在32位大端机器上,一个小的
足够的时间戳不会导致recording
非空。)
复制构造函数和赋值运算符是多余的
并且令人困惑,因为上次初始化类型的测试是
不正确。他们会工作,但更多的是机会而不是其他任何东西。
并且不需要自我分配的测试。 (如果你
需要它们,赋值运算符可能不是线程
安全,但你不需要它们。)
至于如何管理指针:由用户决定
联盟(A
)。工会本身无法知道是否
它包含指针或时间戳,并且无法知道
如何分配指针。据我所知
你发布的代码,联盟从不包含指针,
并且可以由UINT64 timestamp;
直接替换。哪一个
将是最好的解决方案,除非它比你更多
秀。