2017-04-20 6 views
1

私はboost::shared_ptrに合格する必要がありますいるProtobufのポインタであるprotobufのboost :: shared_ptrポインタを関数に渡すにはどうすればよいですか?

boost::shared_ptr<Protobuf::Person::Profile> pProfile = 
     boost::make_shared<Protobuf::Person::Profile>(); 

、いるProtobufの機能oPerson.set_allocated_profile(pProfile)ではなくoPerson.set_allocated()Protobuf::Person::Profileへのポインタを期待しています。

私はいくつかの方法を試しましたが、rapidjson上に構築されたライブラリ関数であるpbjson::pb2Jsonを使用してprotobufオブジェクトをJSONに変換しようとすると、ポインタが範囲違反の原因となります。

方法1:

oPerson.set_allocated_profile(pProfile.get()); 

方法2:いるProtobufメッセージがoperator&に過負荷をかけないので

oPerson.set_allocated_profile(&*pProfile); 
+2

ハード:一生に一度のあなたのスコープを確認しますメモリが使用されても有効であることを確認してください。 –

答えて

2

方法1と2は等価です。

Protobufは内部的に(私はCopy-On-Writeのセマンティクスと呼ばれる)ライフタイムを管理しているので、全体を通して価値の意味を好むでしょう。

所有者が割り当てられた設定者(set_allocated_*)と一緒に転送されているかどうかはわかりません。それを文書化しているソースを見つけたら、教えてください!

Iffset_allocated_profileはポインタの所有権を取ります。どちらのアプローチも正しいわけではありません。所有している共有ポインタからポインタを解放する必要があります(How to release pointer from boost::shared_ptr?参照)。

IFFset_allocated_profileないテイクの所有権をし、私が書くことを好むだろう:

oPerson.mutable_profile()->CopyFrom(*pProfile); 

または同等に:より多くのコンテキストなしで支援する

*oPerson.mutable_profile() = *pProfile; 
関連する問題