带有Google时间戳记的Protobuf C ++消息导致seg错误

时间:2019-07-15 15:10:04

标签: c++ protocol-buffers protobuf-c

我不熟悉google protobuffers,并创建了一条基本消息:

message msg {  
    uint32 id = 1;                             
    google.protobuf.Timestamp timestamp = 2;  
}

现在,我创建了一个小型c ++程序来使用此程序(带有必要的标题)

int main(void) {
  auto m = msg{};
  m.set_id(2);
  auto timestamp = google::protobuf::Timestamp{};
  timestamp.set_seconds(time(NULL));
  timestamp.set_nanos(0);

  m.set_allocated_timestamp(&timestamp);

  std::cout << m.id() << std::endl;
  std::cout << m.timestamp().seconds() << std::endl;

  return 0;
}

但是,此程序出现段错误。

free(): invalid pointer
[1]    9537 abort (core dumped) 

我需要在哪里释放内存?

1 个答案:

答案 0 :(得分:3)

protobuf的set_allocated_foo()函数将获得指针的所有权,并在消息本身超出范围后尝试释放该指针。在https://developers.google.com/protocol-buffers/docs/reference/cpp-generated

中查看更多信息

由于指针指向自动对象,因此尝试删除该指针会产生未定义的行为,在您的情况下会导致核心转储。

要设置protobuf的时间戳,您首先必须使用mutable_timestamp获取指向它的指针,然后才能设置它的各个字段。