- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Google 的 protobuf。我使用 subMessage,我用随机值设置它并将 subMessage 存储在 mainMessage 中。以下是适合我的情况的示例消息:
message subMessage{
required int32 val1= 1;
required int32 val2= 2;
required int32 val3= 3;
required int32 val4= 4;
}
message mainMessage{
required subMessage sub = 1;
}
我的主要:
int main (int argc,char** argv){
subMessage sM;
mainMessage mM;
sM.set_val1(10);
sM.set_val2(9);
sM.set_val3(8);
sM.set_val4(7);
然后我尝试了:
mM.set_allocated_submessage(&sM);
但它会在程序结束时导致段错误(对象的破坏?)。解决它的唯一方法是手动调用 mM.release_submessage();
。
我也试过:
*mM.mutable_submessage()=subMessage;
我不明白为什么我会出现段错误,因为我的程序在之后立即停止(没有访问/写入我的 subMessage 或我的 mainMessage)。
根据Google's documentation :
void set_allocated_foo(Bar* bar): Sets the Bar object to the field and frees the previous field value if it exists. If the Bar pointer is not NULL, the message takes ownership of the allocated Bar object and has_foo() will return true. Otherwise, if the Bar is NULL, the behavior is the same as calling clear_foo()
似乎 mainMessage 在 set_allocated_foo()
之后拥有所有权,但它会导致段错误。另一方面,mutable_foo()
似乎复制了数据。我想避免重复数据,因为我将在 Raspberry 上运行低 RAM,但 set_allocated_foo()
目前对我来说太神秘了。我不明白这两者之间的区别...
你认为我应该使用 .set_allocated_foo()
并手动释放它,还是使用 .mutable_foo()
?
谢谢。
PS:我知道 this topic about set_allocated_foo()但我的问题不是删除与否,而是更多关于指针/数据的权利,并没有帮助我解决我的问题
最佳答案
您的代码通过 delete
删除本地变量运算符(operator)。这是未定义的行为。您的问题是您将指针传递给 LOCAL 变量,您应该分配 subMessage
通过 new
然后你可以将它传递给 mainMessage
.
int main()
{
subMessage sM; // [1]
mainMessage mM;
sM.set_val1(10);
sM.set_val2(9);
sM.set_val3(8);
sM.set_val4(7);
mM.set_allocated_submessage(&sM); // [2]
// calls dtors in reverse order of definitions of instances
dtor on mM is called // [3]
dtor on sM is called // [4]
}
简而言之:
[1] sM
被创建为局部变量
[2] 您将指针传递给局部变量 sM
,在这一刻mM
取得 sM
的所有权
[3] 因为 mM
拥有sM
它试图删除 sM
通过调用 delete ptrToSm
在 dtor 中
[4] 可能永远不会达到这个点,应用程序崩溃了
解决方法:
subMessage* sM = new ...;
mM.set_allocated_submessage(sM);
关于c++ - 谷歌 Protocol Buffer : "mutable_foo()" or "set_allocated_foo()"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53648009/
我期望 new Buffer(buffer.toString()) 始终是逐字节相等的。但是,我遇到的情况并非如此。 首先,这是一个真实的案例: var buf1 = new Buffer(32);
我有用于记录数据的 Protocol Buffer 。 message Message { required double val1 = 1; optional int val2 =
请注意以下简单程序(基于 protobuf-net 项目 v1 wiki 中的示例): using System.Collections.Generic; using System.Diagnosti
在 Protocol Buffer 中,有没有办法让消息包含嵌套消息的集合?例如,消息主管可能有一个员工集合以及主管的姓名和部门。 最佳答案 是的。您使用 repeated领域; message Em
我想知道 Protocol Buffer 在解析流时如何处理损坏的数据。有没有办法知道数据是否已损坏。 Protocol Buffer 是否提供任何内置的数据完整性检查机制? 谢谢, 最佳答案 没有任
Protocol Buffer 如何处理类型版本控制? 例如,当我需要随时间更改类型定义时?就像添加和删除字段一样。 最佳答案 Google 设计的 protobuf 对版本控制非常宽容: 意外数据要
我尝试阅读 Protobuf 文档,但无法想象它可以用于许多用例。我想知道一些实际的 Protocol Buffer 性能改进用例。 谢谢 最佳答案 Protocol buffers 是一个序列化库,
给定 Protocol Buffer 模式和一些数据, Protocol Buffer 序列化是否跨库和语言具有确定性? 基本上,无论使用什么库,我是否可以保证相同的数据总是以相同的方式(直到字节)序
我正在使用一个示例 UWP C++/CX 程序,该程序创建两个 UDP 网络通信线程,它们使用 Windows::Storage::Streams::DataWriter 相互发送数据。和 Windo
我正在使用以下代码 int lenSend = odl->ByteSize(); char* buf = (char *)malloc(lenSend); odl->SerializeToArray(
Protocol Buffer 文档警告说...... You should never add behaviour to the generated classes by inheriting fr
我有一个定义如下的原型(prototype)模式, message User { int64 id = 1; bool email_subscribed = 2; bool sms_
我试图了解 Protocol Buffer 编码方法,将消息转换为二进制(或十六进制)格式时,我无法理解嵌入消息的编码方式。 我猜可能和内存地址有关,但我找不到准确的关系。 这是我所做的。 第 1 步
我需要序列化和反序列化一系列与字节流之间的 Protocol Buffer 消息。有一些预先确定的消息类型。编码类型信息的推荐方法是什么,以便我的应用程序可以知道它应该读取哪种类型? 最佳答案 最常见
与GSON相比, Protocol Buffer (protobuf)的优缺点是什么? 在什么情况下,protobuf比GSON更合适? 对于一个非常笼统的问题,我感到抱歉。 最佳答案 json(通过
message Person { required Empid = 1 [default = 100]; required string name = 2 [default = "Raju"]
我正在研究一个小型设备,该设备具有相当大的一组配置参数(~100 KB),这些参数是从 PC 软件生成的。过去,我们将参数存储在二进制文件中并将它们加载到数据结构中。维护有点烦人(不同的语言,确保结构
来自Encoding - Protocol Buffers - Google Code上的“签名类型”: ZigZag encoding maps signed integers to unsigne
我正在使用 Protocol Buffer ,一切正常。除了我不明白的事实 - 为什么我需要 proto 中的编号标签文件 : message SearchRequest { required s
Protocol Buffer 的吸引人的功能之一是它允许您扩展消息定义,而不会破坏使用较旧定义的代码。对于枚举according to the documentation: a field with
我是一名优秀的程序员,十分优秀!