带有 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(×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
获取指向它的指针,然后您可以设置它的各个字段。
我是 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
获取指向它的指针,然后您可以设置它的各个字段。