Я думаю, что вы можете достичь того, что вы хотите сделать, разделяя a уникальный указатель следующим образом:
std::shared_ptr<std::unique_ptr<MyProto>> myProtoSharedUniquePtr;
Доступ к нему будет более косвенным:
(*myProtoSharedUniquePtr)->do_stuff();
Но вы могли бы вступить во владение так:
CollectionProto collectionProto;
collectionProto.mutable_my_proto().AddAllocated(myProtoSharedUniquePtr->release()); // at this point collectionProto took ownership of the memory
std::string serialization = collectionProto.SerializeAsString();
Однако я хотел бы спросить, почему вы используете std::shared_ptr
для начала.Причина использования std::shared_ptr
заключается в том, что у вас нет контроля над тем, кто будет последним, кто получит к нему доступ, поэтому каждый из них будет поддерживать его до тех пор, пока он не будет готов.Поэтому было бы необычно иметь возможность гарантировать, что все текущие std::shared_ptr
экземпляры больше не используются.
Вы уверены, что std::unique_ptr
не будет лучше для ваших нужд?