c++ - 带有谷歌时间戳的 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(×tamp);
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
,然后可以设置它的各个字段。
推荐阅读
- c# - appsettings.json 中的 AllowedHosts 和 .NET Core API 3.x 中的 UseCors 之间的区别
- javascript - 在我的 React 应用程序上使用 iPhone 禁用双指缩放功能不起作用
- google-analytics - 如何通过 Google Analytics Management API 设置“广告功能”等设置?
- r - 如何将邻接矩阵并入方程(网络模拟)
- c# - C# 使用我在公司域上的电子邮件帐户获取所有用户的电子邮件和电话
- javascript - Android 7 Chrome - play() 失败,因为用户没有先与文档交互
- python - 如何从学生参与的课程中查询文件?
- python - 如何在 IntelliJ 中刷新 Python 插件的骨架?
- html - 如何以角度提交复选框值
- php - 避免在 Symfony 4 中的 handleRequest 期间获取所有实体