创建一个非拥有的shared_ptr?

6

我对C++11还比较陌生,现在正在努力提高我的C++技能,尝试避免直接使用指针。我正试图编写一个精灵管理器,它可以跟踪以前加载的精灵并释放未使用的精灵。我试图使用shared_ptr (指向位图的指针) 来实现这一点,但管理器还必须保持一个shared_ptr来创建精灵,以便引用计数不会降为0。我是否可以在我的管理器中声明“父”shared_ptr为非所有权,因此它不计为引用(并仍然创建该shared_ptr的所有权副本)?

3个回答

11

使用weak_ptr来解决问题。这样你就不需要手动释放它们了,因为它们会自动释放。在weak_ptr上使用锁定操作获取一个实际的shared_ptr。

use_count也可以给出当前引用的数量。


那么我的经理会持有一个weak_ptr,该指针在创建第一个shared_ptr时创建,然后稍后从该weak_ptr创建更多的shared_ptr?听起来不错。 - Cubic
是的,那是正确的。但是如果第一个 shared_ptr 超出了作用域,你就需要重新创建它。 - ThirdOne

3

shared_ptr是用来拥有对象的。如果您希望程序的某个部分使用非拥有指针,请使用weak_ptr:

std::shared_ptr<Object> sp(new Object);
std::weak_ptr<Object>(sp);

1

您正在尝试进行一种“后座驾驶员”式的内存管理;您想使用shared-ptr,但同时也想控制shared_ptr何时释放资源!

这里有几个明显的解决方案。

  1. 在您的精灵管理器类中,只需使用 shared_ptr,不必担心任何内存管理或资源所有权。相信 shared_ptr 能够完成其工作。如果您需要知道资源何时被销毁,您可以始终使用观察者模式或类似方法,并在资源类销毁时向管理器发送消息。当然,这意味着您不能要求您的精灵管理器提供对现有精灵的其他引用,这并不是很好。

  2. 编写自己的智能指针。这并不一定是微不足道的,但编写特定于资源的引用计数智能指针并不是什么难事(例如,它比编写像 shared_ptr 这样的东西简单得多)。然后,当只剩下一个引用时(例如,它自己的引用),管理器可以终止资源。

  3. 其他人已经提到了 weak_ptr。它具有 (1) 的所有优点,只是您可以创建额外的 shared_ptr 实例来引用相同的底层资源。

你可能还要考虑资源使用模式和加载资源的成本。当应用程序停止引用某个资源时,并不一定立即销毁它;如果在一秒钟后再次请求该资源,则可能需要耗费一些时间重新加载它。在资源闲置一段时间后进行延迟释放可能是更好的方法。这只是一个想法。

谢谢你的建议。我正在编写一个分级组织的游戏 - 思路是加载下一级别,然后销毁上一个级别,以保持共享精灵的存活。我还不确定是否要允许在一个级别内加载资源,但即使我这样做,这也将是一个相当罕见的情况。 - Cubic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接