首页 > 解决方案 > 带有谷歌时间戳的 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) 

我需要在哪里释放内存?

标签: c++protocol-buffersprotobuf-c

解决方案


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

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

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


推荐阅读