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

时间:2015-01-10 23:35:53

标签: c++ pointers smart-pointers

我对C ++ 11的智能指针世界有些新意见。我一直在手动进行内存管理,并决定深入研究智能指针。但是,当谈到managers

时,有些混乱

我将经理定义为

  

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

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

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

例如,在视频游戏中,“Sprite”可能会从纹理管理器请求“纹理”。精灵不拥有纹理,只是想使用它。一种方法是使用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的指针,但我可以看到这变成了调试麻烦。

我对智能指针的理解肯定不足。也许我很想知道智能指针应该如何实现?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

如果&#34;它只是想使用它&#34;,那么SpriteTexture*就好了。普通指针很好,只要它们没有与它们相关的所有权语义。

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

当经理决定摆脱相关对象时,你必须确保代码中没有其他部分使用这样的指针,但这与问题中的问题相反。 (你有点暗示这不会成为你申请中的问题。)


附注:我无法想出使用std::list来保存这些智能指针的原因。我认为std::vector应该是您的首选,除非您有特殊原因不在此处使用它。