2012-12-11 6 views
3

네트워크 메시지를 수신하고이를 스마트 포인터에 의해 관리되는 Google 프로토 룸으로 디코딩하는 C++ Qt 코드 섹션이 있습니다. 이 함수는 protobuf의 구조 해석을 수행하여 선택적 메시지 필드가 있는지 확인하고 메시지의 특정 부분이있는 경우 신호를 전달합니다.참조 카운트를 공유하는 관련 스마트 포인터

현재이 신호에는 참조 카운팅을 활용하여 전체 메시지를 포함하는 스마트 포인터 사본이 포함되어 있습니다. 그러나 메시지의 특정 섹션에 스마트 포인터를 전달하여 다운 스트림 처리기가 전체 protobuf를 다시 구문 분석 할 필요가 없도록하고 싶습니다. 새 포인터가 범위를 벗어날 때 해당 섹션을 해제하려고하기 때문에 관련 메시지 섹션에 새 스마트 포인터를 만들 수 없습니다.

몇 가지 안전 검사를,이 설명 생략에 시도 :

void Interface::processProtobuf(QByteArray const & networkData) { 

    QSharedPointer<proto_message> msg(new proto_message); 

    msg->ParseFromArray(networkData.data(), networkData.length()); 

    if (msg->has_configuration()) { 

     // This will eventually attempt to free, thus causing corruption 
     // of msg. 
     QSharedPointer<config_message> cfg(msg->mutable_configuration()); 
     emit configurationChanged(cfg); 

     // I resorted to this, which forces the receiver to re-parse 
     // the data structure (which might be expensive for a deeply-nested 
     // message) to get the desired 'configuration' pointer. 
     emit configurationChanged(msg); 
    } 
} 

이렇게 마, 난 정말 참조 믿을 상속 (증분)는 "관련"하위 포인터를 만들 수있는 방법이 필요합니다 모든 하위 및 상위가 범위를 벗어날 때까지 데이터 소멸자가 호출되지 않도록 상위 포인터. 표준 스마트 포인터 구현 중 하나에서이 기능을 사용할 수 있습니까? 아니면 불필요한 특별한 경우를 만들었습니까? 내가 찾은 가장 가까운 것은 QtQSharedDataPointer<>이지만 하위 포인터를 만드는 경우에는 도움이되지 않는다고 생각합니다.

Qt 솔루션은 필요하지 않습니다. 내 해결 방법은 현재의 경우에 좋으므로 학문적 인 질문이었습니다.

답변

6

std::shared_ptr (또는 boost::shared_ptr 당신이 C++ (11)이없는 경우)는 공유 포인터 r 및 포인터 p를 사용하는 생성자가 있습니다. 생성 된 공유 포인터는 *p을 가리키고, r의 공유 권한을 공유합니다. 이것은 당신이 필요로하는 것이어야합니다.

생성자의 서명은

template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept; 
+0

네입니다. 그게 내가 필요한거야. 나는 그 서명을 찾을 수있을만큼 깊이 파지 않았다. 감사. –