创建一个非拥有的shared_ptr?

时间:2012-07-30 12:55:23

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

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

3 个答案:

答案 0 :(得分:11)

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

use_count也会为您提供当前的参考数量。

答案 1 :(得分:3)

shared_ptr是拥有的。如果你想在prgram的某个部分使用非拥有指针,请使用weak_ptr,如下所示:

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

答案 2 :(得分:1)

你正试图做一种“后座驱动”式的内存管理;您想使用shared-ptr,但您还想控制shared_ptr何时释放资源!

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

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

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

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

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