热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使shared_ptr失去内存的所有权

如何解决《使shared_ptr失去内存的所有权》经验,为你挑选了2个好方法。

我有一个shared_ptr我经过的地方.最终,在某些情况下,我想将原始指针传递给一个函数,然后该函数成为内存所有者.在这些情况下,shared_ptr由于我调用的函数取得了所有权,因此不再负责释放内存.如何让shared_ptr失去所有权?

我想拥有shared_ptr失去所有权的原因是我想使用协议缓冲区的AddAllocated功能,它接受已经分配的指针并承担它的所有权.

例:

shared_ptr 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

AchimGuetlei.. 6

你可以使用a unique_ptr,无论如何更适合传递内存:

unique_ptr myProtoSharedPtr = // create MyPorto object

CollectionProto collectionProto;

// unique_ptr::release returns the pointer and
// releases the ownership of the MyProto object
collectionProto.mutable_my_proto().AddAllocated(myProtoSharedPtr.release());

std::string serialization = collectionProto.SerializeAsString();


Galik.. 6

我认为你可以通过共享一个像这样的独特指针来实现你想要做的事情:

std::shared_ptr> 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();

但是我会质疑你为什么要使用a std::shared_ptr开头.使用a的原因std::shared_ptr是当你无法控制谁将最后访问它时,所以每个人都可以保持活着直到完成.因此,能够保证所有当前std::shared_ptr实例不再使用是不寻常的.

你确定std::unique_ptr你的需求不会更好吗?



1> AchimGuetlei..:

你可以使用a unique_ptr,无论如何更适合传递内存:

unique_ptr myProtoSharedPtr = // create MyPorto object

CollectionProto collectionProto;

// unique_ptr::release returns the pointer and
// releases the ownership of the MyProto object
collectionProto.mutable_my_proto().AddAllocated(myProtoSharedPtr.release());

std::string serialization = collectionProto.SerializeAsString();



2> Galik..:

我认为你可以通过共享一个像这样的独特指针来实现你想要做的事情:

std::shared_ptr> 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();

但是我会质疑你为什么要使用a std::shared_ptr开头.使用a的原因std::shared_ptr是当你无法控制谁将最后访问它时,所以每个人都可以保持活着直到完成.因此,能够保证所有当前std::shared_ptr实例不再使用是不寻常的.

你确定std::unique_ptr你的需求不会更好吗?


推荐阅读
author-avatar
丝家发艺
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有