我现在有一个非常奇怪的问题。
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的地址,并且值是有意义的。但是在那之后,我调用了myMessage.SetOtherFields(),dateTimeValue指针仍然指向相同的内存,这是好的,但是内存中的值变成了一个carzy数字。我不知道发生了什么。
发布于 2013-04-16 02:08:06
一个好的编译器应该警告代码正在使用临时地址。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();
}
};https://stackoverflow.com/questions/16018858
复制相似问题