带有资源管理器的智能指针,允许对象"borrow"资源
Smart pointers with a resource manager that lets objects "borrow" resources
我对C++ 11的智能指针世界有点陌生。我一直在手动进行内存管理,并决定深入研究智能指针。但是,在managers
方面存在一些混乱
我将经理定义为
拥有和管理一组对象的对象。这些对象完全归经理所有,经理有责任控制它们的生命周期(即删除它们)。它分配对象以用于程序的其他部分,但不放弃所有权。
换句话说,它允许程序的其他部分借用它管理的资源。
我有点困惑的是,如何确保经理保留所有权?
例如,在视频游戏中,"精灵"可能会向纹理管理器请求"纹理"。精灵不拥有纹理,它只是想使用它。一种方法是利用unique_ptr
列表。所以我有:
std::list<std::unique_ptr<SpriteTexture>> _spriteTextureList;
但是这不起作用,因为我无法建立对unique_ptr
的weak_ptr
。另一方面,我可以创建一个shared_pointers列表
std::list<std::shared_ptr<SpriteTexture>> _spriteTextureList;
这将允许我将weak_ptr
分配给程序的其他部分。但是,问题是shared_pointer可以复制,将所有权分解为多个指针。如果我从不传回共享指针,这当然是可以控制的,但这样做对于shared_ptr
的含义来说似乎是违反直觉的。
第三种选择是简单地分配shared_ptr
.但是,这没有用,因为这样管理器在技术上并不拥有对象。如果管理器从列表中删除了某个Texture
,而其他内容shared_ptr
了该Texture
,则不会删除纹理。
在理想情况下,这应该没问题,因为在管理器删除它之前不应该有指向Texture
的现有指针,但我可以看到这变成了调试麻烦。
我对智能指针的理解肯定很弱。也许我想念理解应该如何实现智能指针?
任何帮助将不胜感激!
如果"它只是想使用它",那么SpriteTexture*
就可以了。普通指针很好,只要它们没有与之关联的所有权语义即可。
只需使用您的第一个解决方案(std::unique_ptr
)并分配用get()
获得的普通指针。
您只需要确保当管理器决定删除关联的对象时,没有代码的其他部分使用这样的指针,但这与您问题中的问题相反。(你有点暗示这在你的应用程序中不会有问题。
旁注:我想不出使用std::list
来保存这些智能指针的理由。我认为std::vector
应该是你的首选,除非你有特定的理由不在这里使用它。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 带有资源管理器的智能指针,允许对象"borrow"资源