我对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_ptr
与Texture
相同,则纹理将不会被删除。
在理想的情况下,这应该没问题,因为在管理员删除之前,应该没有指向Texture
的指针,但我可以看到这变成了调试麻烦。
我对智能指针的理解肯定不足。也许我很想知道智能指针应该如何实现?
非常感谢任何帮助!
答案 0 :(得分:2)
如果&#34;它只是想使用它&#34;,那么SpriteTexture*
就好了。普通指针很好,只要它们没有与它们相关的所有权语义。
只需使用您的第一个解决方案(std::unique_ptr
)并分发使用get()
获得的常规指针。
当经理决定摆脱相关对象时,你必须确保代码中没有其他部分使用这样的指针,但这与问题中的问题相反。 (你有点暗示这不会成为你申请中的问题。)
附注:我无法想出使用std::list
来保存这些智能指针的原因。我认为std::vector
应该是您的首选,除非您有特殊原因不在此处使用它。