2017-04-20 31 views
1

나는 통과 가지고 boost::shared_ptr :어떻게 protobuf의 boost :: shared_ptr 포인터를 함수에 전달합니까?

protobuf의 기능 oPerson.set_allocated_profile(pProfile)에, protobuf의 포인터하지만 포인터가 Protobuf::Person::ProfileoPerson.set_allocated() 기대
boost::shared_ptr<Protobuf::Person::Profile> pProfile = 
     boost::make_shared<Protobuf::Person::Profile>(); 

.

나는 몇 가지 방법을 시도했지만 protobuf 객체를 JSON으로 변환하려고하면 pbjson::pb2Json은 빠른 json으로 빌드 된 라이브러리 함수이므로 세그먼트 오류가 발생하여 포인터가 범위를 벗어납니다.

방법 1 :

oPerson.set_allocated_profile(pProfile.get()); 

방법 2 :

oPerson.set_allocated_profile(&*pProfile); 
+2

더 컨텍스트없이 도움 : 일생 일대의 당신의 범위를 검토 메모리가 사용 중일 때 여전히 유효한지 확인하십시오. –

답변

2

방법 Protobuf 메시지 operator&에 과부하가 걸리지 않기 때문에 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;