提升时间

时间:2013-04-15 15:18:25

标签: boost time posix

我现在有一个非常奇怪的问题。

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数。我不知道发生了什么。

1 个答案:

答案 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();
  }
};