系统相关
首页 > 系统相关> > c – 使shared_ptr失去内存的所有权

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