Protobuf c++使用小坑(set_allocated函数)
protobuf是后臺開發中,比較常用的數據通信協議。相對于json,具有數據壓縮率高等優點。但是,在某些情況下,稍不留神容易用錯。
最近使用protobuf的時候,使用了相對陌生的復合類型的賦值。結果用錯了,然后就莫名其妙core dump了。
使用的數據類型簡化如下:
[plain]?view plain?copy
大概的使用過程是這樣的:需要在一個for循環里面,把一個Class中的每一個student拷貝到一個局部的Family對象中的owner中。查看了protoc生成的pb.h文件之后,發現有一個set_allocated_owner(::Person* person)這樣的函數。所以,我就使用了如下的代碼:
[cpp]?view plain?copy
然后就coredump了,用gdb調試的時候,發現一堆和protobuf相關的東西,猜測應該是protobuf用錯了,但是想了很久都沒有想到是什么。
但是憑借直覺,這種coredump一般都是和指針相關,想到也就這個地方用了指針,就果斷google了一發protobuf的set_allocated相關的函數,發現果然是用錯了。
看到了這篇文章:http://blog.csdn.net/xiaxiazls/article/details/50118161
主要的意思就是,那個temp_ans是局部變量,會在for循環中一個循環結束之后被析構的,然而,set_allocated_answer中放進去的是這個局部變量的指針。所以,后面這個rsp使用的時候,里面的detail的answer的指針已經指向了非法的內存空間了。coredump妥妥的。
如果需要使用set_allocated這種方法,參數里面的指針需要指向一個在使用到這個數據的時候還沒有被析構的對象(好繞口)。例如,那個指針參數是new 出來的,或者是在一個更外層的嵌套中定義的。但是,protobuf中會負責析構這個傳進去的指針指向的對象,所以,最好傳進去一個new出來的對象的地址,因為如果傳進去一個原來就定義好的對象的地址,可能因為這個析構,而導致原有對象失效,造成一些潛在的問題(set_allocated_xxx中的allocated已經表明,最好是那種分配出來的對象)
像上面的例子,進行復合類型的賦值,用copyFrom比較好,例子如下:
[cpp]?view plain?copy
總結
以上是生活随笔為你收集整理的Protobuf c++使用小坑(set_allocated函数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下拉列表select显示ng-optio
- 下一篇: LLDB基础知识