带有资源管理器的智能指针,允许对象"borrow"资源

Smart pointers with a resource manager that lets objects "borrow" resources

本文关键字:对象 borrow 许对象 资源 资源管理器 智能 指针      更新时间:2023-10-16

我对C++ 11的智能指针世界有点陌生。我一直在手动进行内存管理,并决定深入研究智能指针。但是,在managers方面存在一些混乱

我将经理定义为

拥有和管理一组对象的对象。这些对象完全归经理所有,经理有责任控制它们的生命周期(即删除它们)。它分配对象以用于程序的其他部分,但不放弃所有权。

换句话说,它允许程序的其他部分借用它管理的资源。

我有点困惑的是,如何确保经理保留所有权?

例如,在视频游戏中,"精灵"可能会向纹理管理器请求"纹理"。精灵不拥有纹理,它只是想使用它。一种方法是利用unique_ptr列表。所以我有:

    std::list<std::unique_ptr<SpriteTexture>> _spriteTextureList;

但是这不起作用,因为我无法建立对unique_ptrweak_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应该是你的首选,除非你有特定的理由不在这里使用它。