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

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

我对 C++ 11 的智能指针世界有些陌生。我一直在手动进行内存管理,因此决定深入研究智能指针。然而,当涉及到 managers

时,有些混乱

我将经理定义为

An object that owns and manages a set of objects. The objects are exclusively owned by the manager and it's the manager's responsibly to control their life cycle (ie. delete them). It dispenses the objects for use in other parts of the program, but does not give away ownership.

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

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

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

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

但是这不起作用,因为我无法将 weak_ptr 设置为 unique_ptr。另一方面,我可以创建 shared_pointers

的列表
   std::list<std::shared_ptr<SpriteTexture>> _spriteTextureList;

这将允许我分配 weak_ptr 到程序的其他部分。但是,问题是 shared_pointer 可以重复,将所有权分解为多个指针。如果我从不传回共享指针,这当然可以控制,但这样做似乎违反直觉 shared_ptr 的意思。

第三种选择是简单地分配 shared_ptr。但是,这没有用,因为从技术上讲,管理器并不拥有这些对象。如果管理器从它的列表中删除了一个 Texture,而其他东西有一个 shared_ptrTexture,那么该纹理将不会被删除。

在理想情况下,这应该没问题,因为在管理器删除 Texture 之前,应该没有指向它的现有指针,但我认为这会成为调试的麻烦。

我对智能指针的理解肯定很薄弱。也许我想念应该如何实现智能指针?

非常感谢任何帮助!

如果"it simply wants to use it",那么SpriteTexture*就好了。普通指针没有问题,只要它们没有关联的所有权语义即可。

只需使用您的第一个解决方案 (std::unique_ptr) 并分发通过 get() 获得的普通指针。

当经理决定删除关联对象时,您只需确保代码中没有其他部分使用这样的指针,但这是与您问题中的问题相反的问题。 (您有点暗示这在您的应用程序中不会成为问题。)


旁注:我想不出使用 std::list 来保存那些智能指针的理由。我认为 std::vector 应该是你的首选,除非你有特定的理由不在这里使用它。