gpt4 book ai didi

c++ - 具有资源管理器的智能指针,让对象 "borrow"资源

转载 作者:行者123 更新时间:2023-11-30 03:57:35 25 4
gpt4 key购买 nike

我对 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 ”可能会向纹理管理器请求“纹理”。 Sprite 不拥有纹理,它只是想使用它。一种方法是使用 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,而其他东西有一个指向Textureshared_ptr,那么该纹理将不会被删除。

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

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

非常感谢任何帮助!

最佳答案

如果“它只是想使用它”,那么 SpriteTexture* 就可以了。普通指针没有问题,只要它们没有关联的所有权语义即可。

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

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


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

关于c++ - 具有资源管理器的智能指针,让对象 "borrow"资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27882325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com