c – 使shared_ptr失去内存的所有权
作者:互联网
我有一个shared_ptr< MyProto>我经过的.最终,在某些情况下,我想将原始指针传递给一个函数,然后该函数成为内存所有者.在这些情况下,shared_ptr不再负责释放内存,因为我调用的函数取得了所有权.如何让shared_ptr失去所有权?
我想让shared_ptr失去所有权的原因是我想使用协议缓冲区的AddAllocated功能,它接受已经分配的指针并承担它的所有权.
例:
shared_ptr<MyProto> myProtoSharedPtr = // by this point this is the last reference to the heap allocated MyProto
// I want to add it to a collection and serialize the collection without copying
CollectionProto collectionProto;
collectionProto.mutable_my_proto().AddAllocated(myProtoSharedPtr.get()); // at this point collectionProto took ownership of the memory
std::string serialization = collectionProto.SerializeAsString();
// bad: myProtoSharedPtr.get() will be freed twice
解决方法:
我认为你可以通过分享一个独特的东西来实现你想要做的
像这样的指针:
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不会更好地满足你的需求吗?
标签:c,c11,shared-ptr,protocol-buffers 来源: https://codeday.me/bug/20190910/1800206.html