我现在有一个非常奇怪的问题。
class Message
{
Field time;
void SetTimeStamp()
{
time.dataTimeValue = &boost::posix_time::microsec_clock::universal_time();
}
void SetOtherFields()
{
}
};
class Field
{
boost::posix::ptime* dateTimeValue;
};
int main()
{
Message myMessage;
myMessage.SetTimeStamp();
myMessage.SetOtherFields();
}
当我拨打myMessage.SetTimeStamp()
时,我可以正确设置TimeStamp,我可以看到dateTimeValue
的地址,而Value是有意义的。但在那之后,我调用myMessage.SetOtherFields()
,dateTimeValue
指针仍然指向相同的内存,这是好的,但该内存中的值更改为carzy数。我不知道发生了什么。
答案 0 :(得分:0)
一个体面的编译器应该警告说代码是临时的地址。 microsec_clock::local_time()
函数按值返回ptime
,导致Message::SetTimeStamp
将临时地址存入Field::dateTimeValue
。尝试访问内存的值将导致未定义的行为。
要解决此问题,请考虑更改Field
以聚合boost::posix::ptime
成员变量,而不是指针。
class Field
{
public:
boost::posix_time::ptime dateTimeValue;
};
class Message
{
public:
Field time;
void SetTimeStamp()
{
time.dataTimeValue = boost::posix_time::microsec_clock::universal_time();
}
};