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