0

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

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(),我可以正确设置时间戳,我可以看到的地址dateTimeValue和值是有意义的。但是在那之后,我调用myMessage.SetOtherFields()dateTimeValue指针仍然指向同一个内存,这很好,但是那个内存中的值变成了一个 carzy 数字。我不知道发生了什么。

4

1 回答 1

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();
  }
};
于 2013-04-15T18:08:05.763 回答