4

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

我需要在哪里释放内存?

4

1 回答 1

4

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

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

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

于 2019-07-15T15:16:00.550 回答