【问题标题】:Create a non-owning shared_ptr?创建一个非拥有的shared_ptr?
【发布时间】:2012-07-30 12:55:22
【问题描述】:

我对 C++11 还是很陌生,现在正在努力通过避免直接使用指针来提高我的 C++ 技能。我正在尝试编写一个精灵管理器来跟踪以前加载的精灵并释放未使用的精灵。我正在尝试为此使用 shared_ptr (指向位图的指针),但管理器还必须保留一个 shared_ptr 来创建精灵 - 所以引用计数不会下降到 0。我可以以某种方式声明“父”shared_ptr在我的经理中不拥有所以它不算作参考(并且仍然创建该 shared_ptr 的拥有副本)?

【问题讨论】:

    标签: c++ c++11 shared-ptr resourcemanager


    【解决方案1】:

    使用weak_ptr。这将解决你的问题。您不需要释放它们,因为它们会自动释放。在weak_ptr 上使用锁来获取实际的shared_ptr。

    use_count 还会为您提供当前的引用数。

    【讨论】:

    • 所以我的经理会持有一个weak_ptr,它是在创建第一个shared_ptr时创建的,然后从那个weak_ptr创建更多的shared_ptr?听起来不错。
    • 是的。那是对的。但是,如果第一个 shared_ptr 超出范围,则需要重新创建它。
    【解决方案2】:

    shared_ptr 被视为拥有。如果您想在 prgram 的某些部分使用非拥有指针,请使用 weak_ptr,如下所示:

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

    【讨论】:

      【解决方案3】:

      你正在尝试做一种“后座司机”风格的内存管理;你想使用shared-ptr,但你也想控制shared_ptr何时释放资源!

      您可以在这里做一些显而易见的事情。

      1. 只需使用 shared_ptr 即可,无需在 sprite 管理器类中处理任何类型的内存管理或资源所有权。信任shared_ptr 来完成它的工作。如果您需要知道资源何时被销毁,您始终可以使用观察者模式等,并让您的资源类在销毁时向管理器发送消息。当然,这意味着您不能要求您的精灵管理器提供对现有精灵的额外引用,这不是很好。

      2. 编写您自己的智能指针。这不一定是微不足道的,但是编写一个特定于资源的引用计数智能指针并不是火箭科学(例如,它比编写类似shared_ptr 的东西要简单得多)。然后,当只剩下一个对资源的引用(例如,它自己的引用)时,管理器可以终止资源。

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

      您可能还需要考虑资源使用模式以及加载资源的成本。您可能不一定要在应用程序停止引用资源后立即销毁它;如果一秒钟后再次请求它,可能需要一些时间来重新加载它。在资源闲置一段时间后懒惰地释放资源可能是一种更好的方法。只是一个想法。

      【讨论】:

      • 感谢您的提示。我正在编写一个按关卡组织的游戏 - 想法是加载下一个关卡,然后销毁前一个关卡,以便共享精灵保持活跃。我还不确定我是否要允许在一个级别内加载资源,但即使我这样做了,这也将是一种相当罕见的情况。
      猜你喜欢
      • 2011-09-29
      • 2014-12-16
      • 2017-05-25
      • 2014-08-10
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 2018-04-14
      相关资源
      最近更新 更多