带有 google 时间戳的 Protobuf C++ 消息导致段错误

Protobuf C++ message with google timestamp leads to seg fault

我是 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) 

哪里需要释放内存?

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

查看更多

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

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